오브젝트 — 코드로 이해하는 객체지향 설계¶
정의¶
한국어로 쓰인 객체지향 설계 입문서 중 가장 자주 권장되는 책. "책임 주도 설계(Responsibility-Driven Design)" 관점에서 OO를 처음부터 다시 짠다 — 데이터·상속·다형성 같은 문법 항목이 아니라 객체 간의 협력과 책임 분배를 중심에 두고 절·장이 흘러간다.
"메시지가 객체를 결정한다. 행동이 상태를 결정한다." (3장 절 제목)
책 메타데이터¶
| 항목 | 값 |
|---|---|
| 저자 | 조영호 |
| 출판 | 위키북스 (2019) |
| 분량 | 약 700페이지, 15장 + 부록 4편 |
| 언어 | 한국어 |
| 선행 도서 | 같은 저자의 객체지향의 사실과 오해 (위키북스, 2015) — 짧고 비유 중심, 입문용 |
| 관계 도서 | 오브젝트 = 같은 주장에 대한 본격 코드 기반 해설 |
| 공식 페이지 | https://wikibook.co.kr/object/ |
핵심 메시지 (목차에서 그대로 도출)¶
| 메시지 | 출처 절 | 풀이 |
|---|---|---|
| 자율성을 높이자 | 1.03 | 객체가 자기 데이터를 스스로 책임지게 → 캡슐화 = "잘못된 상태를 막는 것" |
| 메시지가 객체를 결정한다 | 3.02 | 클래스부터 그리지 말고, 어떤 메시지가 필요한지부터 → 그 메시지를 잘 처리할 객체를 찾는다 |
| 행동이 상태를 결정한다 | 3.02 | 필드부터 그리지 말고, 행동(책임)부터 정한 뒤 필요한 상태만 갖는다 |
| 데이터보다 행동을 먼저 결정하라 | 5.01 | 4장의 "데이터 중심 설계"가 왜 망가지는지 보여준 뒤, 역순으로 재정렬 |
| 묻지 말고 시켜라 (Tell, Don't Ask) | 6.02 | getter로 꺼내 와 호출자가 처리하지 말고, 객체에게 일을 시켜라 |
| 명령-쿼리 분리 (CQS) | 6.04 | 한 메서드는 상태를 바꾸거나 값을 돌려주거나, 둘 중 하나만 |
| new는 해롭다 | 8.02 | 구체 클래스 직접 생성은 결합도를 만든다 → DI/Factory로 분리 |
| 객체 합성이 클래스 상속보다 더 좋다 | 11.03 | GoF Design Patterns 원칙을 한국어 시나리오(핸드폰 과금)로 재증명 |
| 서브클래싱 ≠ 서브타이핑 | 13.03 | 코드 재사용용 상속과 타입 호환용 상속은 다르다 → LSP |
이 9개가 책 전체를 관통하는 골격. 나머지 챕터는 모두 이 메시지를 영화 예매·핸드폰 과금 두 시그니처 예제로 반복 증명한다.
챕터 흐름 (4부 구조)¶
목차에는 부 구분이 없지만 흐름상 4부로 묶을 수 있다.
| 부 (논리적) | 장 | 목적 |
|---|---|---|
| I. 도입 — 무엇이 문제인가 | 들어가며·1·2 | 절차지향 코드의 한계 → 영화 예매 시스템으로 첫 OO 구현 |
| II. 책임 관점으로 재정렬 | 3·4·5·6·7 | 데이터 중심 설계의 함정 → 책임 주도 설계 → GRASP → 메시지·인터페이스 → 객체 분해 |
| III. 유연성을 만드는 도구 | 8·9·10·11·12·13 | 의존성 관리 → OCP·DIP → 상속의 한계 → 합성 → 다형성 → LSP |
| IV. 큰 그림 | 14·15·마치며 | 일관된 협력 패턴 → 디자인 패턴·프레임워크 → 앞으로 |
| 부록 | A·B·C·D | 계약에 의한 설계(DbC), 타입 계층 구현 기법, 동적 협력 vs 정적 코드, 참고문헌 |
5권 도서 오각형 — OO 설계 학습의 5권 세트¶
OO 설계 핵심 5권이 서로 다른 단위·시점에서 같은 OO 결론을 가리킨다.
| 책 | 관점 | 단위 | 시점 | 언어 |
|---|---|---|---|---|
| (이 책) entity-object 오브젝트 | 책임 주도 설계 (목적지) | 객체·협력·역할 | 처음부터 잘 설계 | Java |
| entity-effective-java Effective Java | 90 권고 (매뉴얼) | 메서드·필드·생성자 | 매번 짤 때 | Java |
| entity-refactoring 리팩터링 2판 | 카탈로그 (가는 길) | 1단계 변환 | 이미 짠 코드 | JS (2판) |
| entity-clean-code Clean Code | 미시 규칙 + 휴리스틱 | 줄·이름·함수 | 매 라인 | Java |
| entity-tdd TDD | 사이클 (만드는 과정) | 사이클 1회 (분) | 코드 짜기 전 | Java + Python |
오브젝트 의 자리 : OO 설계의 목적지 를 가장 풍부한 한국어 시나리오 (영화 예매·핸드폰 과금) 로 그려냄. 다른 4권이 매번·1단계·1줄·1사이클 단위라면 오브젝트 는 객체·협력 단위의 큰 그림.
추천 학습 순서 (5권 전체): 1. Clean Code 2·3·4·10장 — 가장 빠른 효과 (줄·이름) 2. Effective Java 2·3·8·10장 — Java 권고 90 개 3. 리팩터링 3장 (24 악취) + 6장 (기본) — 기존 코드 개선 어휘 4. 오브젝트 1~5장 + 11장 — OO 설계 큰 그림 (이 책) 5. TDD 1·2부 — 테스트가 설계 끌어내기 6. 5권 교차 참조
시그니처 예제 (책 전반에서 반복)¶
| 예제 | 등장 | 무엇을 보여주는가 |
|---|---|---|
| 티켓 판매 애플리케이션 | 1장 | 첫 절차지향 → OO 리팩터링 과정 (책의 출발점) |
| 영화 예매 시스템 | 2·3·4·5·6장 | 할인 정책/조건의 다형성, 데이터 중심 설계의 함정 |
| 핸드폰 과금 시스템 | 10·11·14장 | 상속의 폭발적 조합 문제 → 합성으로 해결, 일관된 협력 패턴 |
| 강의 평가 | 12장 | 상속의 데이터 관점 vs 행동 관점 |
→ 두 시그니처 예제(영화 예매·핸드폰 과금)는 책을 통째로 관통하므로, 한 번 익혀두면 인용·발표 자리에서 바로 꺼내 쓸 수 있는 자산.
책의 주제 → 위키 기존 페이지 매핑¶
| 책 주제 | 장 | 위키 기존 페이지 |
|---|---|---|
| 객체지향 4원칙 (캡슐화·상속·다형성·추상화) | 2·12 | concept-oop |
| 디자인 패턴 23개 + 프레임워크 | 15 | concept-design-patterns |
| Strategy 패턴 (할인 정책 다형성의 직접 사례) | 2.03 | concept-design-patterns (전략 패턴 섹션) |
| Template Method / Factory | 5·9 | concept-design-patterns |
| 도메인 모델 / 분석·설계·구현 모델 | 부록 C | src-kakaopay-ddd (DDD 실전), concept-spring-core (IoC) |
| 의존성 주입 / IoC | 9 | concept-spring-core (Spring DI), concept-design-patterns (Factory) |
| 계약에 의한 설계 / 사전·사후조건 / 불변식 | 부록 A | (신규 후보 — concept-design-by-contract, 미작성) |
| 리스코프 치환 원칙 (LSP) | 13 | (신규 후보 — concept-solid, 미작성) |
| 개방-폐쇄 원칙 (OCP) / 의존성 역전 (DIP) | 9 | (신규 후보 — concept-solid, 미작성) |
| GRASP (책임 할당 9패턴) | 5 | (신규 후보 — concept-grasp, 미작성) |
→ 신규 concept 후보 4개 (DbC·SOLID·GRASP·DDD 모델 종류) — 사용자가 책 노트·발췌 보내주면 그때 ingest. 백로그에도 등록.
위키 기존 페이지에 보강할 인용 후보¶
| 페이지 | 어디서 인용 | 효과 |
|---|---|---|
| concept-oop | "본질: 객체가 자기 데이터에 책임을 진다" 옆에 책 출처 명기 | 위키의 OO 정의에 한국어 표준 인용 추가 |
| concept-design-patterns | "객체 합성이 클래스 상속보다 더 좋다" 인용 (11.03) | GoF 원칙의 한국어 출처 |
| concept-design-patterns Strategy 섹션 | 영화 예매 할인 정책을 사례로 추가 | 추상 사례 → 친숙한 한국어 사례 |
같은 인사이트 패턴 — "데이터부터 그리면 망한다"¶
| 영역 | "데이터 먼저" 함정 | "책임/행동 먼저" 해법 | 참조 |
|---|---|---|---|
| 객체 설계 | 필드부터 그리고 getter/setter 양산 → 빈혈 모델 | 메시지·책임부터 → 필요한 상태만 | (오브젝트 3·4·5장) |
| DB 풀 운영 | 풀 크기 기본값 가정 → 운영 사고 | 부하 측정·트랜잭션 점유 시간 먼저 | concept-db-connection-pool |
| VARCHAR 길이 | 255 신화로 그냥 시작 | 인덱스·utf8mb4 바이트 계산 먼저 | concept-varchar-length-prefix |
| API 계약 | DTO 필드 먼저 다 만들기 | Tolerant Reader 가정·진화 시나리오 먼저 | concept-api-backward-compatibility |
→ 공통 원리: 정적 구조(데이터·필드·기본값)에서 출발하면 동적 행동(변경·부하·진화)을 못 견딘다. 행동·시나리오부터 정의한 뒤 정적 구조를 유도하는 것이 변경에 강한 설계의 공통 원칙.
누구에게·언제 권할 책인가¶
| 독자 | 효과 |
|---|---|
| OO 입문을 막 뗀 신입~3년차 | 4원칙(캡슐화·상속·다형성·추상화)을 안다고 생각했는데, "왜 그렇게 해야 하는가" 가 비로소 연결됨 |
| Spring·JPA만 익숙한 5~10년차 | 프레임워크 위에서 코드를 짜 왔지만 "내가 도메인 모델링을 못 하는 것 같다" 는 의심이 든 시점 |
| DDD 책으로 좌절한 사람 | Evans/Vernon의 DDD가 추상적이라 어렵게 느꼈다면, 오브젝트가 그 앞 단계의 누락된 기반을 채워준다 |
| 신입 교육 자료를 짜는 사람 | 영화 예매 시스템 예제를 통째로 신입 교육 모듈로 재사용 가능 |
빠른 진단 — 이 책을 펴야 할 신호¶
- getter/setter가 클래스의 80% 이상이고, "캡슐화는 했는데?" 라는 생각이 든다
- Strategy/Template Method 같은 패턴 이름은 알지만 언제 꺼내야 할지 직감이 없다
- 상속을 쓸 때 항상 찜찜한데 합성으로 갈아탈 자신이 없다
- DI 컨테이너 없이 객체 생성·연결을 직접 해 본 적이 별로 없다 (
new의존도가 높다) - LSP·OCP·DIP를 외웠지만 코드 리뷰에서 적용 사례를 못 짚는다
위 중 2개 이상이면 1~5장 + 11장만 먼저 읽어도 가치 있다.
한계·주의¶
- 분량이 크다 (700페이지) — 절·장이 반복적이라 한 번에 다 못 읽음. 3장·5장·11장·13장이 가장 응축돼 있어 그것부터 발췌 가능.
- 한국어 전용 — 영어판 없음. 해외 동료와 같은 책으로 토론은 어려움.
- Java 7~8 기준 코드 (2019년 출판) — record·sealed 같은 신문법은 안 다룸. 메시지·책임 관점은 언어 버전과 무관해서 큰 문제 아님.
원본 출처¶
raw/object/toc.md— 사용자가 입력한 목차 (2026-06-20)raw/object/오브젝트 실전 강의 교재 1~15장.md + 부록 A·B·C— 18편 강의 교재 (사용자 입력 1·2·3장 + 본 세션 작성 4~15장·부록, 약 4,000줄)- 통합 인덱스: src-object-lecture
- 책 본문 직접 인용 아닌 강의용 재구성
관련 페이지¶
- concept-oop — 객체지향 4원칙 (책의 2장·12장 기반과 직접 연결)
- concept-design-patterns — 디자인 패턴 (책의 15장 + Strategy 사례)
- entity-effective-java — Effective Java (90 아이템의 권고 = 메서드 단위 / 오브젝트는 객체 단위)
- entity-refactoring — Martin Fowler 리팩터링 2판 (책임 주도 설계가 도달점이라면, 리팩터링은 거기까지 가는 카탈로그)
- entity-clean-code — Robert C. Martin Clean Code (객체 단위가 오브젝트 라면, 줄·이름 단위가 Clean Code. 6장 "객체와 자료 구조"·디미터 법칙 직접 다룸)
- concept-spring-core — IoC·DI (책의 9장 의존성 주입)
- src-kakaopay-ddd — DDD 실전 사례 (책의 부록 C 도메인 모델 + 본문 책임 주도 설계)
- concept-db-connection-pool / concept-varchar-length-prefix / concept-api-backward-compatibility — "데이터 먼저 함정" 패턴 비교