3 분 소요

Head First Design Patterns

디자인 패턴을 좀더 깊게 공부해볼 필요성을 느껴서 처음에 GoF의 디자인 패턴을 사서 보려고 하였는데, 회사 동료가 먼어 읽어보라고 준 책이 Head First Design Patterns이다.

나중에 GoF의 디자인 패턴책을 살 생각이지만 Head First Design Patterns책을 먼저 읽은 것은 잘한 것 같다. 주요 디자인 패턴을 어떤 상황에서 사용하면 좋은지에 대해 자세하고 알기 쉽게 설명해주어서 나와 같은 디자인패턴 초심자들에게는 좋은 책이지 않나 싶다.

아래에 이 책에서 강조하는 객체지향의 기초객체지향 원칙, 객체지향 패턴에 대해 간단히 소개하고자 한다.

객체지향의 기초

  • 추상화
  • 캡슐화
  • 다형성
  • 상속

객체지향 원칙

바뀌는 부분은 캡슐화 한다.

캡슐화를 하면 변경이 발생할 때 다른 부분에 영향을 미치지 않고 그 부분만 고치거나 확장할 수 있다.

상속보다는 구성을 활용한다.

상속보다는 구성이 유연성이 좋기 때문이다.

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

인터페이스에 의존되게 프로그래밍을 하면 유연성을 증대시킬 수 있다.

서로 상호작용하는 객체 사이에서는 가능하면 느슨하게 결합하는 디자인을 사용해야 한다.

이는 구현이 아닌 인터페이스에 맞춰서 프로그래밍한다.와 비슷한 의도를 가진다. 즉 프로그래밍의 유연성을 증대시키기 위한 방법이다.

클래스는 확장에 대해서는 열려 있어야 하지만 코드 변경에 대해서는 닫혀 있어야 한다.

OCP(Open-Closed Principle)이라고 부르는 이 원칙은 인터페이스를 통해 정의된 기능을 구현을 통해 새롭게 추가하는 것은 쉽게 설계하면서 인터페이스에 정의된 기능 자체를 변경하는 것은 지양하도록 설계하는 것을 말한다.

추상화된 것에 의존하도록 만들어라. 구상클래스에 의존하도록 만들지 않도록 한다.

고수준의 구성요소가 저수준의 구성요소에 의존하면 안된다는 말이다. DIP(Dependency Inversion Principle)를 예로 들 수 있다.

친한 친구들하고만 이야기 한다.

최소 지식 원칙이라고 하며 어떤 객체든 그 객체와 상호작용 하는 클래스의 개수는 적을 수록 좋다. 즉, 디자인의 결합을 최대한 줄이기 위한 기법이다.

Hollywood Principle

의존성 부패(dependency rot) 즉, 의존성이 서로 복잡하게 꼬여 있는 것을 방지하기 위한 방법이다. 고수준의 구성요소가 저수준의 구성요소에 대해 모르도록 하는 원칙이다.

클래스가 바뀌는 이유는 한가지 뿐이어야 한다.

클래스에 역할은 하나만 가지도록 하는 원칙을 말한다.

객체지향 패턴

Strategy Pattern

알고리즘군을 정의하고 각각을 캡슐화하여 바꿔 쓸 수 있게 만든다.

Observer Pattern

한 객체의 상태가 바뀌면 그 객체에 의존하는 다른 객체들한테 연락이 가고 자동으로 내용이 갱신되는 방식으로 1:N 의존성을 정의한다.

Decorator Pattern

객체에 추가적인 요건을 동적으로 추가한다.

Factory Method Pattern

객체를 생성하기 위한 인터페이스를 정의하는데, 어떤 클래스의 인스턴스를 만들지는 서브클래스에서 결정하게 만든다.

Abstract Factory Pattern

인터페이스를 이용하여 서로 연관된, 또는 의존하는 객체를 구상 클래스를 지정하지 않고도 생성할 수 있다.

Singleton Pattern

해당 클래스의 인스턴스가 하나만 만들어지고, 어디서든지 그 인스턴스에 접근할 수 있도록 하기 위한 패턴이다.

Command Pattern

요청 내역을 객체로 캡슐화하여 클라이언트를 서로 다른 요청 내역에 따라 매개변수화 할 수 있다. 요청을 큐에 저장하거나 로그로 기록할 수도 있고 작업취소 기능을 지원할 수도 있다.

Adapter Pattern

한 클래스의 인터페이스를 클라이언트에서 사용하고자 하는 다른 인터페이스로 변환한다.

Facade Pattern

어떤 서브시스템의 일련의 인터페이스에 대한 통합 인터페이스를 제공한다.

Template Method Pattern

함수에서 알고리즘의 골격을 정의하고 알고리즘의 여러 단계중 일부는 서브클래스에서 정의하는 방식으로 알고리즘의 구조는 그대로 유지하면서 서브클래스에서 특정 단계를 재정의하도록 하는 패턴을 말한다.

Iterator Pattern

컬렉션 구현 방법을 노출시키지 않으면서도 그 집합체 안에 들어있는 모든 항목에 접근할 수 있게 해 주는 방법을 말한다.

Composite Pattern

객체들을 트리구조로 구성하여 부분-전체 계층구조를 구현한다.

State Pattern

객체의 내부 상태가 바뀜에 따라서 객체의 행동을 바꿀 수 있는 패턴을 말한다.

Proxy Pattern

다른 객체를 대변하는 객체를 만ㄴ들어서 주 객체에 대한 접근을 제어할 수 있도록 하는 패턴을 말한다.

Compound Pattern

두 개 이상의 패턴을 결합하여 일반적으로 자주 등장하는 문제들에 대한 해법을 제공하는 패턴을 말한다.


책에서는 특정 예제를 통해 위에 정의된 디자인 패턴과 객체지향 원칙에 대해 설명해준다. 이번에는 책을 읽고 이해하는데 집중하였는데, 다시 한번 읽으면서 코드를 직접 작성해 보려고 한다. 디자인 패턴은 알고 있는 것도 중요하지만 적절한 상황에 잘 적용할 수 있는 것이 더 중요하다고 한다. 적절한 상황에 잘 적응하기 위해서는 의도적으로 적용해 보기 위한 노력을 꾸준히 해야 할 것이다. 다만 책에서도 말하고 있듯이 디자인 패턴은 만병 통치약이 아니며 불필요한 디자인패턴의 적용은 오히려 복잡성을 증가 시킬 수 있으므로 경계해야 한다.

나는 이제 디자인 패턴을 알아가고 있는 초보자이다. 많이 연습해보고 각 패턴들의 쓰임새를 이해하기 위해 앞으로도 더 노력해야겠다.

http://www.yes24.com/Product/Goods/17525598

http://www.hanbit.co.kr/store/books/look.php?p_code=B9860513241