옮긴이 머리말 xiii
베타리더 후기 xiv
시작하며 xvi
CHAPTER 1 개요 1
1.1 코드 설계를 배우는 이유 1
__1.1.1 고품질의 코드 작성 2 / 1.1.2 복잡한 코드 개발 다루기 2
__1.1.3 프로그래머의 기본 능력 4 / 1.1.4 경력 개발에 필요한 기술 5
__1.1.5 생각해보기 5
1.2 코드 품질 평가 방법 6
__1.2.1 유지 보수성 8 / 1.2.2 가독성 9 / 1.2.3 확장성 10 / 1.2.4 유연성 10
__1.2.5 간결성 11 / 1.2.6 재사용성 11 / 1.2.7 테스트 용이성 12 / 1.2.8 생각해보기 12
1.3 고품질 코드를 작성하는 방법 12
__1.3.1 객체지향 13 / 1.3.2 설계 원칙 13 / 1.3.3 디자인 패턴 14
__1.3.4 코딩 규칙 15 / 1.3.5 리팩터링 기법 15 / 1.3.6 생각해보기 17
1.4 과도한 설계를 피하는 방법 18
__1.4.1 코드 설계의 원래 의도는 코드 품질을 향상시키는 것이다 18
__1.4.2 코드 설계의 원칙은 앞에 문제가 있고, 뒤에 방안이 있다는 것이다 18
__1.4.3 코드 설계의 응용 시나리오는 복잡한 코드에 적용되어야 한다 19
__1.4.4 지속적인 리팩터링은 과도한 설계를 효과적으로 방지할 수 있다 20
__1.4.5 특정 시나리오 외의 코드 설계에 대해 이야기하지 않는다 20
__1.4.6 생각해보기 21
CHAPTER 2 객체지향 프로그래밍 패러다임 23
2.1 객체지향이란 무엇인가? 23
__2.1.1 객체지향 프로그래밍과 객체지향 프로그래밍 언어 23
__2.1.2 엄격하게 정의되지 않은 객체지향 프로그래밍 언어 25
__2.1.3 객체지향 분석과 객체지향 설계 26
__2.1.4 UML에 대한 참고 사항 27
__2.1.5 생각해보기 28
2.2 캡슐화, 추상화, 상속, 다형성이 등장한 이유 28
__2.2.1 캡슐화 28 / 2.2.2 추상화 31 / 2.2.3 상속 33 /
__2.2.4 다형성 35 / 2.2.5 생각해보기 39
2.3 객체지향 분석, 객체지향 설계, 객체지향 프로그래밍을 수행하는 방법 40
__2.3.1 예제 소개와 난이도 분석 40
__2.3.2 객체지향 분석 수행 방법 41
__2.3.3 객체지향 설계 방법 45
__2.3.4 객체지향 프로그래밍을 하는 방법 53
__2.3.5 생각해보기 55
2.4 객체지향 프로그래밍, 절차적 프로그래밍, 함수형 프로그래밍의 차이 55
__2.4.1 절차적 프로그래밍 55
__2.4.2 객체지향 프로그래밍과 절차적 프로그래밍의 비교 59
__2.4.3 함수형 프로그래밍 62
__2.4.4 객체지향 프로그래밍과 함수형 프로그래밍의 비교 69
__2.4.5 생각해보기 69
2.5 객체지향 프로그래밍처럼 보이지만 실제로는 절차적 프로그래밍 70
__2.5.1 getter, setter 메서드 남용 70
__2.5.2 전역 변수와 전역 메서드의 남용 74
__2.5.3 데이터와 메서드 분리로 클래스 정의하기 77
__2.5.4 생각해보기 79
2.6 빈약한 도메인 모델에 기반한 전통적인 개발 방식은 OOP를 위반하는가? 79
__2.6.1 빈약한 도메인 모델에 기반한 전통적인 개발 방식 80
__2.6.2 풍성한 도메인 모델에 기반한 DDD 개발 방식 82
__2.6.3 두 가지 개발 방식의 비교 83
__2.6.4 빈약한 도메인 모델에 기반한 전통적인 개발 방식이 널리 사용되는 이유 90
__2.6.5 풍성한 도메인 모델에 기반한 DDD 개발 방식의 응용 시나리오 91
__2.6.6 생각해보기 92
2.7 추상 클래스와 인터페이스 93
__2.7.1 추상 클래스와 인터페이스의 정의와 차이점 93
__2.7.2 추상 클래스와 인터페이스의 의미 97
__2.7.3 추상 클래스와 인터페이스의 모의 구현 100
__2.7.4 추상 클래스와 인터페이스의 응용 시나리오 102
__2.7.5 생각해보기 102
2.8 인터페이스 기반 프로그래밍:
모든 클래스에 대해 인터페이스를 정의해야 할까? 102
__2.8.1 인터페이스를 이해하는 다양한 방법 103
__2.8.2 설계 철학을 실제로 적용해보자 104
__2.8.3 인터페이스의 남용을 방지하려면 어떻게 해야 할까? 108
__2.8.4 생각해보기 109
2.9 상속보다 합성 109
__2.9.1 상속이 더 이상 사용되지 않는 이유 109
__2.9.2 합성이 상속에 비해 나은 장점 112
__2.9.3 합성을 사용할지 상속을 사용할지 결정하기 114
__2.9.4 생각해보기 115
CHAPTER 3 설계 원칙 117
3.1 단일 책임 원칙 117
__3.1.1 단일 책임 원칙의 정의 및 해석 117
__3.1.2 클래스에 단일 책임이 있는지 판단하는 방법 118
__3.1.3 클래스의 책임이 가능한 한 자세하게 설명되어 있는지 여부 121
__3.1.4 생각해보기 123
3.2 개방 폐쇄 원칙 123
__3.2.1 확장할 때는 개방, 수정할 때는 폐쇄 123
__3.2.2 코드를 수정하는 것은 개방 폐쇄 원칙을 위반하는 것일까? 129
__3.2.3 확장할 때는 개방, 수정할 때는 폐쇄를 달성하는 방법 131
__3.2.4 프로젝트에 개방 폐쇄 원칙을 유연하게 적용하는 방법 133
_