오브젝트

오브젝트

조영호의 객체지향 설계 교과서를 장별로 정리한 노트. 영화 예매와 핸드폰 과금, 두 예제가 절차에서 책임으로 진화하는 과정을 diff로 따라간다.

조영호의 『오브젝트 — 코드로 이해하는 객체지향 설계』를 읽으며 장 단위로 정리합니다. 클린 코드가 문장 수준, 리팩터링이 변형 수준, TDD가 작업 리듬이었다면 이 책은 설계 수준입니다 — 객체에게 어떤 책임을 주고, 객체들이 어떻게 협력하게 할 것인가.

책을 관통하는 예제는 둘입니다.

  • 영화 예매 시스템 — 2장에서 객체지향답게 등장했다가, 4장에서 일부러 데이터 중심으로 망가뜨리고, 5장에서 책임 주도 설계로 되살립니다. 같은 문제의 세 가지 설계를 나란히 볼 수 있는 드문 구성.
  • 핸드폰 과금 시스템 — 10장에서 상속으로 시작해 11장에서 합성으로 갈아타고, 14장에서 일관성 있는 협력으로 완성됩니다.

두 예제 모두 코드가 장을 넘어 진화하므로, 노트에서는 스텝 플레이어의 diff로 설계가 바뀌는 순간을 기록합니다.

Contents

  1. 01
    1장 객체, 설계티켓 판매 예제. Theater가 관람객의 가방을 직접 뒤지는 절차적 코드를, 각 객체가 자기 일을 스스로 처리하는 자율적 협력으로 바꾼다. 의존성과 결합도가 설계 품질을 가르는 첫 장면.
  2. 02
    2장 객체지향 프로그래밍영화 예매 시스템이 등장한다. 할인 로직을 Movie에 직접 박는 대신 DiscountPolicy 추상 클래스로 뽑아내고, 금액/비율 할인을 다형성으로 갈아 끼운다. 컴파일 타임 의존성과 런타임 의존성이 갈리는 지점.
  3. 03
    3장 역할, 책임, 협력객체지향 설계의 재료는 클래스가 아니라 역할·책임·협력이다. 협력이 책임을 부르고, 책임이 역할을 만들고, 역할이 객체를 고른다. 책임 주도 설계의 사고 순서를 개념으로 정리하는 장.
  4. 04
    4장 설계 품질과 트레이드오프영화 예매를 일부러 데이터 중심으로 다시 짜서 망가뜨린다. ReservationAgency가 모든 로직을 쥐고 MovieType으로 switch를 돌리는 코드에서 캡슐화 붕괴·높은 결합도·낮은 응집도를 진단한다. 5장이 되살릴 출발점.
  5. 05
    5장 책임 할당하기데이터 중심으로 망가진 영화 예매 코드를 책임 주도로 되살린다. GRASP — 정보 전문가, 낮은 결합도, 높은 응집도, 창조자 — 를 기준으로 책임의 집을 찾아 주고, 조건 타입 분기는 다형성으로 흩는다.
  6. 06
    6장 메시지와 인터페이스협력의 품질은 메시지가 정한다. 기차 충돌을 부르는 디미터 법칙 위반, 묻지 말고 시켜라, 구현이 아니라 의도를 드러내는 인터페이스, 그리고 명령과 쿼리를 분리해 부수효과를 길들이는 법.
  7. 07
    7장 객체 분해급여 관리 시스템으로 큰 문제를 작게 나누는 두 방식을 견준다. 프로시저 추상화(기능 분해)와 데이터 추상화, 그리고 데이터 추상화 안에서 다시 갈라지는 추상 데이터 타입(ADT)과 객체지향 클래스.
  8. 08
    8장 의존성 관리하기잘 설계된 협력은 의존성을 관리한다. 컴파일타임 의존성과 런타임 의존성을 분리하고, new를 밀어내 의존성을 주입하고, 숨은 의존성을 드러내 바꿀 수 있는 코드로 만든다.
  9. 09
    9장 유연한 설계개방-폐쇄 원칙을 코드로 만드는 도구들. 추상화에 의존하기, 생성과 사용의 분리, 팩토리, 그리고 의존성 주입 대 서비스 로케이터 — 왜 주입이 로케이터를 이기는가.
  10. 10
    10장 상속과 코드 재사용핸드폰 과금 시스템 등장. Phone 과 NightlyDiscountPhone 의 중복을 상속으로 지웠더니, 세금 요구사항 하나에 중복이 되살아난다. 취약한 기반 클래스 문제를 스텝으로 목격한다.
  11. 11
    11장 합성과 유연한 설계상속으로 조합을 감당하려다 클래스가 폭발한다. RatePolicy 인터페이스로 요금제를 합성하고, 세금·기본요금 할인을 데코레이터로 감싸 런타임에 조립한다. 핸드폰 과금의 최종 구조.
  12. 12
    12장 다형성업캐스팅과 동적 바인딩이 어떻게 하나의 메시지를 여러 구현으로 잇는가. 메서드 탐색은 언제나 self 참조에서 시작하고, 상속의 진짜 본질은 코드 재사용이 아니라 타입 계층이다.
  13. 13
    13장 서브클래싱과 서브타이핑상속을 코드 재사용(서브클래싱)으로 쓸 것인가, 타입 계층(서브타이핑)으로 쓸 것인가. is-a의 함정, 리스코프 치환 원칙, 계약에 의한 설계 관점에서 본 행동 호환성.
  14. 14
    14장 일관성 있는 협력핸드폰 과금 시스템에 새 요금제가 계속 추가될 때, 요금제마다 조건 로직을 제각각 구현하면 유사 기능이 서로 다른 방식으로 흩어진다. 변하는 것과 변하지 않는 것을 분리해 일관된 협력 패턴을 세운다.
  15. 15
    15장 디자인 패턴과 프레임워크패턴은 설계의 재사용, 프레임워크는 코드의 재사용과 제어 역전. STRATEGY·TEMPLATE METHOD·DECORATOR가 이 책의 예제들 속에 이미 나와 있었음을 회수하며, 절차에서 책임과 협력으로 이어진 여정을 정리한다.