오브젝트 - 코드로 이해하는 객체지향 설계
Description
역할, 책임, 협력을 향해 객체지향적으로 프로그래밍하라!
객체지향으로 향하는 첫걸음은 클래스가 아니라 객체를 바라보는 것에서부터 시작한다. 객체지향으로 향하는 두번째 걸음은 객체를 독립적인 존재가 아니라 기능을 구현하기 위해 협력하는 공동체의 존재로 바라보는 것이다. 세번째 걸음을 내디딜 수 있는지 여부는 협력에 참여하는 객체 들에게 얼마나 적절한 역할과 책임을 부여할 수 있느냐에 달려 있다. 객체지향의 마지막 걸음은 앞에서 설명한 개념들을 여러분이 사용하는 프로그래밍 언어라는 틀에 흐트러짐 없이 담아낼 수 있는 기술을 익히는 것이다.

《객체지향의 사실과 오해》가 첫번째 걸음과 두번째 걸음인 객체와 협력에 초점을 맞췄다면 《오브젝트: 코드로 이해하는 객체지향 설계》는 세번째와 네번째 걸음인 책임의 할당과 그 구현에 초점을 맞춘다. 이 책을 읽고 나면 객체에 적절한 역할과 책임을 부여하는 방법과 유연하면서도 요구사항에 적절한 협력을 설계하는 방법을 익히게 될 것이다. 나아가 프로그래밍 언어라는 도구를 이용해 객체지향의 개념과 원칙들을 오롯이 표현할 수 있는 방법 역시 익힐 수 있을 것이다.

★ 이 책에서 다루는 내용 ★

◎ 역할, 책임, 협력에 기반해 객체지향 프로그램을 설계하고 구현하는 방법
◎ 응집도와 결합도를 이용해 설계를 트레이드오프하는 방법
◎ 설계를 유연하게 만드는 다양한 의존성 관리 기법
◎ 타입 계층을 위한 상속과 코드 재사용을 위한 합성의 개념
◎ 다양한 설계 원칙과 디자인 패턴

저자

조영호

목차

▣들어가며:프로그래밍패러다임
01패러다임의시대
02프로그래밍패러다임

▣1장:객체,설계
01.티켓판매애플리케이션구현하기
02.무엇이문제인가
___예상을빗나가는코드
___변경에취약한코드
03.설계개선하기
___자율성을높이자
___무엇이개선됐는가
___어떻게한것인가
___캡슐화와응집도
___절차지향과객체지향
___책임의이동
___더개선할수있다
___그래,거짓말이다!
04.객체지향설계
___설계가왜필요한가
___객체지향설계

▣2장:객체지향프로그래밍
01.영화예매시스템
___요구사항살펴보기
02.객체지향프로그래밍을향해
___협력,객체,클래스
___도메인의구조를따르는프로그램구조
___클래스구현하기
___협력하는객체들의공동체
___협력에관한짧은이야기
03.할인요금구하기
___할인요금계산을위한협력시작하기
___할인정책과할인조건
___할인정책구성하기
04.상속과다형성
___컴파일시간의존성과실행시간의존성
___차이에의한프로그래밍
___상속과인터페이스
___다형성
___인터페이스와다형성
05.추상화와유연성
___추상화의힘
___유연한설계
___추상클래스와인터페이스트레이드오프
___코드재사용
___상속
___합성

▣3장:역할,책임,협력
01.협력
___영화예매시스템돌아보기
___협력
___협력이설계를위한문맥을결정한다
02.책임
___책임이란무엇인가
___책임할당
___책임주도설계
___메시지가객체를결정한다
___행동이상태를결정한다
03.역할
___역할과협력
___유연하고재사용가능한협력
___객체대역할
___역할과추상화
___배우와배역

▣4장:설계품질과트레이드오프
01.데이터중심의영화예매시스템
___데이터를준비하자
___영화를예매하자
02.설계트레이드오프
___캡슐화
___응집도와결합도
03.데이터중심의영화예매시스템의문제점
___캡슐화위반
___높은결합도
___낮은응집도
___캡슐화를지켜라
04.자율적인객체를향해
___스스로자신의데이터를책임지는객체
___캡슐화위반
05.하지만여전히부족하다
___높은결합도
___낮은응집도
___데이터중심설계는객체의행동보다는상태에초점을맞춘다
06.데이터중심설계의문제점
___데이터중심설계는객체를고립시킨채오퍼레이션을정의하도록만든다

▣5장:책임할당하기
01.책임주도설계를향해
___데이터보다행동을먼저결정하라
___협력이라는문맥안에서책임을결정하라
___책임주도설계
02.책임할당을위한GRASP패턴
___도메인개념에서출발하기
___정보전문가에게책임을할당하라
___높은응집도와낮은결합도
___창조자에게객체생성책임을할당하라
03.구현을통한검증
___DiscountCondition개선하기
___타입분리하기
___다형성을통해분리하기
___변경으로부터보호하기
___Movie클래스개선하기
___변경과유연성
04.책임주도설계의대안
___메서드응집도
___객체를자율적으로만들자

▣6장:메시지와인터페이스
01.협력과메시지
___클라이언트-서버모델
___메시지와메시지전송
___메시지와메서드
___퍼블릭인터페이스와오퍼레이션
___시그니처
02.인터페이스와설계품질
___묻지말고시켜라
___의도를드러내는인터페이스
___함께모으기
03.원칙의함정
___디미터법칙은하나의도트(.)를강제하는규칙이아니다
___결합도와응집도의충돌
04.명령-쿼리분리원칙
___반복일정의명령과쿼리분리하기
___명령-쿼리분리와참조투명성
___책임에초점을맞춰라

▣7장:객체분해
01.프로시저추상화와데이터추상화
02.프로시저추상화와기능분해
___메인함수로서의시스템
___급여관리시스템
___급여관리시스템구현
___하향식기능분해의문제점
___언제하향식분해가유용한가?
03.모듈
___정보은닉과모듈
___모듈의장점과한계
04.데이터추상화와추상데이터타입
___추상데이터타입
05.클래스
___클래스는추상데이터타입인가?
___추상데이터타입에서클래스로변경하기
___변경을기준으로선택하라
___협력이중요하다

▣8장:의존성관리하기
01.의존성이해하기
___변경과의존성
___의존성전이
___런타임의존성과컴파일타임의존성
___컨텍스트독립성
___의존성해결하기
02.유연한설계
___의존성과결합도
___지식이결합을낳는다
___추상화에의존하라
___명시적인의존성
___new는해롭다
___가끔은생성해도무방하다
___표준클래스에대한의존은해롭지않다
___컨텍스트확장하기
___조합가능한행동

▣9장:유연한설계
01.개방-폐쇄원칙
___컴파일타임의존성을고정시키고런타임의존성을변경하라
___추상화가핵심이다
02.생성사용분리
___FACTORY추가하기
___순수한가공물에게책임할당하기
03.의존성주입
___숨겨진의존성은나쁘다
04.의존성역전원칙
___추상화와의존성역전
___의존성역전원칙과패키지
05.유연성에대한조언
___유연한설계는유연성이필요할때만옳다
___협력과책임이중요하다

▣10장:상속과코드재사용
01.상속과중복코드
___DRY원칙
___중복과변경
___상속을이용해서중복코드제거하기
___강하게결합된Phone과NightlyDiscountPhone
02.취약한기반클래스문제
___불필요한인터페이스상속문제
___메서드오버라이딩의오작용문제
___부모클래스와자식클래스의동시수정문제
03.Phone다시살펴보기
___추상화에의존하자
___차이를메서드로추출하라
___중복코드를부모클래스로올려라
___추상화가핵심이다
___의도를드러내는이름선택하기
___세금추가하기
04.차이에의한프로그래밍

▣11장:합성과유연한설계
01.상속을합성으로변경하기
___불필요한인터페이스상속문제:java.util.Properties와java.util.Stack
___메서드오버라이딩의오작용문제:InstrumentedHashSet
___부모클래스와자식클래스의동시수정문제:PersonalPlaylist
02.상속으로인한조합의폭발적인증가
___기본정책과부가정책조합하기
___상속을이용해서기본정책구현하기
___기본정책에세금정책조합하기
___기본정책에기본요금할인정책조합하기
___중복코드의덫에걸리다
03.합성관계로변경하기
___기본정책합성하기
___부가정책적용하기
___기본정책과부가정책합성하기
___새로운정책추가하기
___객체합성이클래스상속보다더좋은방법이다
04.믹스인
___기본정책구현하기
___트레이트로부가정책구현하기
___부가정책트레이트믹스인하기
___쌓을수있는변경

▣12장:다형성
01.다형성
02.상속의양면성
___상속을사용한강의평가
___데이터관점의상속
___행동관점의상속
03.업캐스팅과동적바인딩
___같은메시지,다른메서드
___업캐스팅
___동적바인딩
04.동적메서드탐색과다형성
___자동적인메시지위임
___동적인문맥
___이해할수없는메시지
___self대super
05.상속대위임
___위임과self참조
___프로토타입기반의객체지향언어

▣13장:서브클래싱과서브타이핑
01.타입
___개념관점의타입
___프로그래밍언어관점의타입
___객체지향패러다임관점의타입
02.타입계층
___타입사이의포함관계
___객체지향프로그래밍과타입계층
03.서브클래싱과서브타이핑
___언제상속을사용해야하는가?
___is-a관계
___행동호환성
___클라이언트의기대에따라계층분리하기
___서브클래싱과서브타이핑
04.리스코프치환원칙
___클라이언트와대체가능성
___is-a관계다시살펴보기
___리스코프치환원칙은유연한설계의기반이다
___타입계층과리스코프치환원칙
05.계약에의한설계와서브타이핑
___서브타입과계약

▣14장:일관성있는협력
01.핸드폰과금시스템변경하기
___기본정책확장
___고정요금방식구현하기
___시간대별방식구현하기
___요일별방식구현하기
___구간별방식구현하기
02.설계에일관성부여하기
___조건로직대객체탐색
___캡슐화다시살펴보기
03.일관성있는기본정책구현하기
___변경분리하기
___변경캡슐화하기
___협력패턴설계하기
___추상화수준에서협력패턴구현하기
___구체적인협력구현하기
___협력패턴에맞추기
___패턴을찾아라

▣15장:디자인패턴과프레임워크
01.디자인패턴과설계재사용
___소프트웨어패턴
___패턴분류
___패턴과책임-주도설계
___캡슐화와디자인패턴
___패턴은출발점이다
02.프레임워크와코드재사용
___코드재사용대설계재사용
___상