헤드 퍼스트 디자인 패턴 총정리

Broccolism·2023년 5월 1일
16

⚠️ 이번 글은 각 디자인 패턴에 대한 상세한 설명보다는 전체적인 내용 정리를 하는 글입니다. 각 패턴에 대해 자세히 알아보고 싶다면 아래쪽 '같이 보면 좋은 링크'를 참고해주세요.

전체 그림 미리보기

헤드 퍼스트 디자인 패턴에 나오는 패턴을 총 정리 해보자. 디자인 패턴은 OOP에 기반을 두고 있다. 새 기능이나 개념이 필요하면 일단 객체나 인터페이스를 만드는 식이다.

디자인 패턴의 3가지 범주

늘 그렇듯 무언가 범주화 하는 데에는 다양한 방식이 있다. 헤드 퍼스트 디자인 패턴 책에서 소개하는 방법은 아래 3가지 방법으로 분류하는 것이다. 책에 나와 있듯이 4가지로 분류하자는 의견, 완전히 다르게 분류해야 한다는 의견 등이 있지만 일단은 아래 범주로 나눠보자. (그리고 이렇게 나누면 글자수도 딱 맞아서 마음이 편안-해진다.)

  • Creational Pattern 생성 패턴: 객체 생성과 관련된 패턴.
    • 객체를 생성하는 코드를 재사용할 수 있다. 복붙하지 않아도 된다는 뜻이다.
    • 객체 생성 부분을 다른 로직과 분리하여 느슨한 결합을 달성할 수 있다.
  • Behavioral Pattern 행동 패턴: 객체 간 역할(= 행동)을 정해주는 패턴.
    • 여러 클래스, 객체에 걸친 알고리즘을 패턴화한다.
    • 누가 어떤 역할을 할 지 책임을 분리하는 것을 목적으로 한다.
  • Structural Pattern 구조 패턴: 객체를 더 큰 구조로 만들기 위한 패턴.
    • 기존 구조를 크게 바꾸지 않고 객체와 클래스를 더 큰 구조로 조립한다.
    • 전체 구조는 유연성이 있어야 하고 효율적이어야 한다.

설명만 보면 '그냥 객체 생성하고, 역할 정하고, 크게 더 붙이면 되는거 아닌가?' 라고 생각할 수도 있지만 디자인 패턴은 그 작업들을 어떻게하면 '잘' 할 지에 대한 것이다. 잘 한다는 것은...

  • 재사용성
  • 확장성
  • 유연성

... 등등 한번쯤 들어봤을만한 '좋은 설계'를 위한 원칙을 지키면서 구조를 만드는 것이다.

하나씩 살펴보기

Creational Pattern 생성 패턴

: 객체 생성과 관련된 패턴

  • 객체를 생성하는 코드를 재사용할 수 있다. 복붙하지 않아도 된다는 뜻이다.
  • 객체 생성 부분을 다른 로직과 분리하여 느슨한 결합을 달성할 수 있다.

  • Factory Method Pattern 팩토리 메소드 패턴: 서브클래스에서 생성할 구상 클래스를 결정한다.
    • PizzaStore라는 Factory 인터페이스를 종류별 피자 가게가 구현하고, 각 피자 가게에서는 종류별 피자를 생성한다.
    • 종류별 피자(뉴욕 스타일 피자, 시카고 스타일 피자)는Pizza라는 Product 인터페이스를 구현한다.
  • Abstract Factory Pattern 추상 팩토리 패턴: 클라이언트에서 구상 클래스를 지정하지 않으면서도 객체군을 생성할 수 있게 해준다.
    • 팩토리 메소드 패턴과 다른 점은 팩토리가 만드는 제품 인터페이스의 종류가 다양해진 것 뿐이다.
    • 팩토리 메소드 패턴은 '피자' 하나만 만들 수 있었지만 추상 팩토리 패턴에서는 피자에 들어갈 '치즈', '소스', '반죽' 등 여러가지 제품을 만들 수 있다.
  • Singleton Pattern 싱글톤 패턴: 딱 한 객체만 생성되도록 한다.
    • uniqueInstance를 미리 만든 다음 그 객체와 생성자를 private하게 숨긴다.
    • 싱글톤 클래스의 객체는 getInstance() 를 통해서만 얻을 수 있다.

Behavioral Pattern 행동 패턴

: 객체 간 역할(= 행동)을 정해주는 패턴

  • 여러 클래스, 객체에 걸친 알고리즘을 패턴화한다.
  • 누가 어떤 역할을 할 지 책임을 분리하는 것을 목적으로 한다.

  • Observer Pattern 옵저버 패턴: 상태가 변경되면 다른 객체들에게 연락을 돌릴 수 있게 해준다.
    • Observer는 Subject를 구독한다. Subject는 변경이 있을 때마다 notifyObservers()를 호출해 변경이 발생했음을 알려준다.
  • State Pattern 상태 패턴: 상태를 기반으로 하는 행동을 캡슐화하고, 위임으로 필요한 행동을 선택한다.
    • Context는 여러가지 상태를 가질 수 있다.
    • 상태를 나타내는 클래스는 해당 상태일 때 어떤식으로 행동해야 하는지를 구현한다. Context는 이 구현 내용을 모르고 State.handle() 을 호출한다.
  • Iterator Pattern 반복자 패턴: 컬렉션이 어떤 식으로 구현되었는지 드러내지 않으면서 컬렉션 내에 있는 모든 객체를 대상으로 반복 작업을 처리할 수 있게 한다.
    • for loop, while loop 을 돌게 하는 대신 hasNext(), next() 등 새로운 접근 방식을 제공한다.
  • Command Pattern 커맨드 패턴: 요청을 객체로 감싼다.
    • Command를 구현하는 커맨드 객체는 클라이언트의 요청을 의미한다.
    • 커맨드 객체를 받았을 때 어떻게 처리할 지는 Receiver 리시버만 알고 있다. 따라서 커맨드를 실행해야 할 때는 커맨드 객체 내에서 receiver.action()을 호출한다.
    • Invoker 인보커는 '실행 해야함'을 관리한다.
    • 클라이언트는 커맨드와 리시버를 연결하고, 원하는 때에 인보커를 통해 '커맨드 실행' 명령을 내린다. 인보커는 그 명령을 받아서 command.execute()을 호출한다.
  • Template Method Pattern 템플릿 메소드 패턴: 알고리즘의 개별 단계를 구현하는 방법을 브클래스에서 결정한다.
    • AbstractClass에서는 전체 알고리즘의 뼈대를 잡는다. 개별 단계 중 일부가 항상 같은 동작을 해야 한다면 이곳에서 구현할 수도 있다.
    • ConcreteClass에서는 알고리즘 단계 중, 매번 바뀌는 부분을 구현한다.
  • Strategy Pattern 전략 패턴: 교환 가능한 행동을 캡슐화하고 위임으로 어떤 행동을 사용할지 결정한다.
    • 대부분 패턴에서 쓰인다.
    • '날기' 동작을 의미하는 FlyBehavior를 만들고 클라이언트는 이를 갖는다.
    • FlyBehavior를 구현하는 클래스에서 종류별 '날기' 동작을 정의할 수 있다.

Structural Pattern 구조 패턴

: 객체를 더 큰 구조로 만들기 위한 패턴

  • 기존 구조를 크게 바꾸지 않고 객체와 클래스를 더 큰 구조로 조립한다.
  • 전체 구조는 유연성이 있어야 하고 효율적이어야 한다.

  • Composite Pattern 컴포지트 패턴: 클라이언트에서 객체 컬렉션과 개별 객체를 똑같이 다룰 수 있게 한다.
    • 트리 구조의 객체 관계가 필요할 때 컴포지트 패턴을 사용한다.
    • Leaf는 트리 구조의 리프 노드, Composite는 내부 노드(internal node)를 의미한다. 이 둘은 같은 인터페이스를 구현하기 때문에 클라이언트에서는 객체 컬렉션과 개별 객체를 똑같이 다룰 수 있게 한다.
  • Decorator Pattern 데코레이터 패턴: 객체를 감싸서 새로운 행동을 제공한다.
    • 객체의 기존 구조, 역할을 해치지 않고 새로운 행동을 제공할 수 있다.
    • DecoratorComponent를 구현하기도 하면서 필드로 가지고 있는다. ConcreteDecorator에서 새로운 기능을 추가한다.
  • Adaptor Pattern 어댑터 패턴: 객체를 감싸서 다른 인터페이스를 제공한다.
    • 오브젝트 어댑터, 클래스 어댑터 2가지가 있다.
    • 기존 클래스를 바꾸지 않고 새로운 인터페이스로 감싸서 제공할 수 있다.
  • Proxy Pattern 프록시 패턴: 객체를 감싸서 그 객체로의 접근을 제어한다.
    • RealSubject로 들어오는 요청을 Proxy가 가로챈 다음 RealSubject.request()를 호출한다.
    • 클라이언트는 그저 Subject.request()를 호출하기 때문에 이 사실을 알 수 없다.

같이 보면 좋은 링크

profile
코드도 적고 그림도 그리고 글도 씁니다. 넓고 얕은 경험을 쌓고 있습니다.

2개의 댓글

comment-user-thumbnail
2023년 5월 5일

다음 책은 뭘까요!?

1개의 답글