Design Pattern

[Design Pattern] OOP Design Principle : 디자인 패턴을 관통하는 원칙

유자맛바나나 2021. 11. 14. 21:50

 

 

디자인 원칙1

애플리케이션에서 달라지는 부분을 찾아내고, 달라지지 않는 부분으로부터 분리해 캡슐화한다.

달라지는 부분(새로운 요구사항이 있을때마다 바뀌는 부분)을 찾아서 나머지 코드에 영향을 주지 않도록 "캡슐화"한다. 그렇게 하면 나중에 바뀌지 않는 부분에는 영향을 미치지 않은 채로 그 부분만 고치거나 확장할 수 있다.

이 개념은 모든 디자인 패턴의 기반을 이루는 원칙이다. 모든 패턴은 '시스템의 일부분을 다른 부분과 독립적으로 변화 시킬 수 있는' 방법을 제공하기 위한 것이다.

 

디자인 원칙2

구현이 아닌 인터페이스에 맞춰서 프로그래밍한다.

 

 

디자인 원칙3

상속(Inheritance)보다는 구성(Composition)을 활용한다.

상속(Inheritance)은 재사용성을 높여주지만 확장성과 유연성은 낮다. 상속을 사용할 경우 수퍼 클래스에서 정의한 메서드들은 모든 서브 클래스에서 사용하지 않는 상황이 발생할 수 있다. 이를 해결하려면 사용하지 않는 서브클래스에서 오버라이드를 해줘야 하고, 중복이 발생한다. 

반면, 구성(Composition)은 위에서 언급한 메서드들을 별도의 인터페이스와 구현체로 캡슐화하여 기존 클래스에서 분리한 후, 기존 클래스에 인스턴스로 부여한다. 이렇게 두 클래스(기존 클래스와 분리한 메서드 클래스)를 합치는 것을 "구성을 이용하는 것"이라고 한다고 한다. 구성을 이용한 대표적인 패턴이 전략 패턴(Strategy Pattern)이다.

구성을 이용해 시스템을 만들면 재사용성을 높여줄 뿐만 아니라, 런타임에 동적으로 변경할 수 있도록 유연성을 높여준다. 그리고 새로운 방식의 행동(전략, 알고리즘 등으로 표현 가능)이 나온다면 인터페이스의 구현체를 추가하면 되므로 확장성이 높다.