CS/디자인패턴

[디자인 패턴] 개요

_OB1N 2021. 5. 17. 16:59

 

개발자가 자신이 작성한 코드에 바라는 건 다음 3가지 정도가 될 수 있다.

 

  1. 유연성(Flexible): 작은 노력으로 코드의 변화를 줄 수 있으면 좋겠다.
  2. 재사용성(Re-Usable): 다른 곳에 가져다 쓸 때, 별 탈없이 쓸 수 있으면 좋겠다.
  3. 유지보수성(Maintainable): 코드를 수정할 때, 다른 부분에 영향이 없이 쉽게 수정할 수 있으면 좋겠다.

이 요소과 더불어 가독성과 같은 추가적인 요소까지 모두 고려하면서 코드를 작성하는 것은 엄청난 노력이 필요할 것이다.

 

그래서!! 과거 선배 개발자들이 열심히 고민하면서 만들어낸 구조를 일반화시켜서 동일한 성격의 다양한 상황에 적용될 수 있도록 한 것이 바로 "디자인 패턴"이다.

 

1. 객체 지향 설계 원칙 _ SOLID원칙

먼저, 좋은 객체 지향 코드란 어떤 원칙을 따라야 하는가... 에 대해서 조금 더 알아보고 넘어가려고 한다.

 

일반적으로 코드의 품질에 대해 이야기 할때 응집도와 결합도에 대한 이야기를 하곤 하는데, 응집도는 높고 결합도는 낮은 것을 좋은 코드라 이야기한다. 이러한 관점을 객체 지향적으로 어떻게 만들 수 있는가에 대해 정리한 것이 SOLID원칙이다.

 

  • SRP (단일 책임 원칙, Single Responsibility Principle): 한 클래스(또는 함수)는 하나의 책임만 가져야 한다.
  • OCP (개방-폐쇄 원칙, Open-Closed Principle): 확장에는 열려있으나, 변경에는 닫혀 있어야 한다.
    • 자주 변경되는 요소를 찾아 인터페이스나 추상 클래스로 클래스를 만들고 이를 이용해라.

  • LSP (리스코프 치환 법칙, Liskov Substitution Principle): 객체를 하위 타입의 인스턴스로 교체 가능해야 한다.
  • ISP (인터페이스 분리 원칙, Interface Segregation Principle): 인터페이스가 잘 분리되어 있어야 한다.
    • 인터페이스가 범용적으로 설계되어 있으면, 해당 인터페이스를 상속받은 클래스 입장에서는 필요 없는 기능임에도 불구하고 구현해야 하는 문제가 있기에 좋지 못한 설계에 속한다.

  • DIP (의존관계 역전 원칙, Dependency Inversion Principle): 의존관계에 있어 변하기 쉬운 것(구체적인 클래스)보다, 변하기 어려운 것(인터페이스, 추상 클래스)에 의존해야 한다.
    • 구체적인 클래스에 변화를 주어야 한다고 생각해보면, 이 변화는 상위 클래스에 연쇄적인 변화를 만들게 될 것이고, 이는 좋지 못한 설계이다.

2. 디자인 패턴

디자인 패턴은 크게 3가지 종류(Creational, Structural, Behavoir)로 나누어진다.

 

Creational Patterns Structural Patterns Behavoir Patterns
Abstract Factory (추상 팩토리) Adapter (어댑터) Chain of Reponsibility (책임 연쇄)
Builder (빌더) Bridge (브리지) Command (커맨드)
Factory Method (팩토리 메소드) Composite (컴퍼지트) Interpreter (인터프리터)
Prototype (프로토타입) Decorator (데코레이터) Mediator (중재자)
Singleton (싱글톤) Facade (퍼사드) Memento (메멘토)
  Flywieght (플라이웨이트) Observer (옵저버)
  Proxy (프록시) State (상태)
    Stratgy (전략)
    Template Method (템플릿 메소드)
    Visitor (방문자)

 

이러한 구분을 GoF 패턴이라 하며, 하나씩 공부해 가면서 정리해가고자 한다.

 

References

- Rohig Joshi. (2015). Java Design Patterns. Java Code Geeks

- https://dev-momo.tistory.com/entry/SOLID-%EC%9B%90%EC%B9%99