배경지식

Interface

객체의 인터페이스는 객체의 operation으로 이루어져있다. 인터페이스는 객체의 operation에 의해 정의된 모든 시그니처의 모음이고, 객체가 응답할 수 있는 모든 요청을 설명한다.

Implementation / Encapsulation

깔끔하게 interface와 implementation을 분리하려면 implementation이 캡슐화(encapsulation)되어야 한다. 캡슐화는 객체의 implementation details를 모두 숨기는 것이다. 객체는 오직 그 객체의 인터페이스를 통해서만 상호작용한다. 각자가 실행되는 것은 독립적이다.

Design for Class Inheritance

부모 클래스와 자식 클래스 사이의 개념적인 의존성은 캡슐화를 방해한다. 즉, 부모 클래스의 디테일한 implementation이 자식 클래스에게 숨겨지지 않고, 부모의 implementation을 변경하는 것은 존재하는 자식 클래스를 변경하게 만들거나, 망가지게 한다.

Overview

Changing Behavior - 요구사항 변경과 독립적인 시스템 만들기

객체 구성을 통한 Run-time 유연성

  • Strategy: 다른 알고리즘을 사용함. 어떤 알고리즘을 사용할지 동적으로 선택하게 함
  • State: 내부의 state가 변경되었을 때 객체의 행동을 변경시킴
  • Decorator: 객체에 책임들(responsibilities)을 동적으로 추가함
  • Proxy: 객체가 접근되는 방법을 통제한다.

객체 상속을 통한 Compile-time 유연성

  • Template Method: 행동을 정의해서 자식 클래스가 동작하는 몇 부분을 행동의 구조를 변경하는 것 없이 바꾼다.

Changing Object Creation - 객체가 생성되는 방법에 독립적인 시스템 만들기

객체 구성을 통한 Run-time 유연성

  • Abstract Factory: 다양한 객체의 가족들을 만든다.
  • Builder: 복잡한 객체에 대해 다양한 Representation을 만든다.
  • Prototype: 프로토타입 객체를 클론해서 새로운 객체를 만든다.

객체 상속을 통한 Compile-time 유연성

  • Factory Method: 객체를 만들어서 자식 클래스가 객체를 만들어내는 방법을 변경할 수 있게 한다.

그 외

  • Singleton: 클래스가 하나의 인스턴스만을 갖는 것을 확실하게 한다. 유일한 인스턴스가 글로벌하게 접근될 수 있게 만든다.

Changing interface independently

  • Adapter: 객체에게 다양한 인터페이스를 제공한다.
  • Bridge: 관념적인 것을 implementation에서 분리시킨다.
  • Facade: 간단한 인터페이스를 복잡한 하위 시스템에게 제공한다.

Storing and Restoring Object State

  • Memento: 객체의 내부 상태를 캡슐화를 깨지 않고 저장한다.

Interpreter / Domain Specific Languages

  • Interpreter: 간단한 언어로 문장을 해석한다.

정리하면서

한글 책도 사서 같이 보는 게 좋을 것 같다. 앞으로 하나 하나 공부하고 난 후 정리하면서 글을 쓸텐데 최대한 추상적이지 않게 이해한 바를 글로 적어보려고 한다.