10. Design - Principles

디자인 원칙이란

말 그대로 소프트웨어를 설계할 때 고려해야할 원칙들이다. 4가지 원칙을 알아보자.

  • step-wise refinement
  • abstraction
  • modulization
  • SOLID

Step-Wise Refinement

하나의 큰 덩이를 감당할 수 없으면 작은 단계들로 나누어 차근차근 진행하는 것을 의미한다. 예를 들어 틱택토(Tic-Tac-Toe)를 만든다고 해보자.

Untitled

Level 1에서 게임을 3단계로 나누었다. 그리고 Level 2에서는 나누어진 단계에서 더욱 세분화하는 모습이다.

추상화(Abstraction)

숨길 것은 숨기고 보일 것은 보이는 방법이다. 지하철 노선도를 생각하자. 역 사이의 거리 차이나 자잘한 요소들은 모두 숨기고 역과 노선만을 보여준다. 이러한 추상화에는 두 가지 종류가 있다.

  • Procedural abstractions

    함수 추상화라고 생각하면 편하다. 함수명과 매개변수, 리턴 타입은 알려주지만 내부 알고리즘은 공개하지 않는다.

  • Data abstractions

    데이터를 보여주되, 그 구조(배열, 리스트 등)는 보여주지 않는다. 클래스가 대표적이다. Information hiding, Encapsulation, Abstract data types 모두 같은 말이다.

모듈화(Modulization)

연관된 요소들을 묶어서 하나의 모듈로 만들고, 이를 사용하는 방법이다. 모듈화 할 때 주의해야 할 요소는 두 가지가 있다. 결합도와 응집도가 모두 높은 모듈이 좋다.

  • 결합도(Coupling)

    → 하나의 모듈이 다른 모듈에 얼마나 의존하는지를 나타낸다. 두 개의 모듈이 얼마나 밀접한지 그 정도를 나타낸 것이다.

  • 응집도(Cohesion)

    → 하나의 모듈이 하나의 기능만을 가지고 있는지를 나타낸다. 필요 없는 기능들이 하나의 모듈로 묶여있지는 않은가?

결합도

Untitled

제어결합은 제어버스에서 숫자로 기능을 통제하는 것을, 공통결합은 전역 변수를 생각하자. 내용결합은 다른 모듈 내부의 지역변수를 사용하는 방법이다. 의존성이 매우 높기에 잘 사용하지 않는다.

위쪽이 결합도가 높고, 아래로 갈수록 결합도가 낮아진다.

응집도

Untitled

결합도처럼 위쪽이 응집도가 높고 아래로 갈수록 응집도가 낮아진다.

SOLID

객체지향과 연관이 깊은 5가지 설계 원리를 의미한다. 앞글자를 따서 SOLID이다.

단일 책임 원리(SRP : Single Responsibility Principle)

Untitled

하나의 모듈은 하나의 기능이나 책임을 수행해야 한다. 한 모듈에 몰려있으면 분산할 필요가 있다.

개방-폐쇄 원리(OCP : Open-Close Principle)

Untitled

모든 모듈은 새로운 확장은 허용하되(Open), 기존 코드는 수정하지 않도록(Closed) 설계되어야한다.

리스코프 치환원리(LSP : Liskov Substitution Principle)

Untitled

자식 클래스의 객체는 부모 클래스의 객체를 대신할 수 있어야 한다. 부모 클래스에게 기대했던 동작들이 자식 클래스에서도 그대로 동작해야 한다는 것이다.

인터페이스 분리원리(ISP : Interface Segregation Principle)

Untitled

하나의 범용 인터페이스보다는 여러개로 분할된 단일 기능 인터페이스가 좋다.

의존 역전 원리(DIP : Dependency Inversion Principle)

Untitled

가급적 추상화 된 것에 의존하고 구체적인 것에 의존하지 말라는 것이다. 변경이 덜한 것에 의존하라.

참고자료

  • 해커와 화가(폴 그레이엄, 한빛미디어, 2014)
  • 소프트웨어 공학의 모든 것(최은만, 생능출판사, 2020)
  • Java 객체지향 디자인 패턴(정인상, 채흥석, 한빛미디어)