목차
저자서문 ... 3
역자서문 ... 4
이 책의 특징 ... 6
이 책의 독자 ... 7
이 책의 구성 ... 8
이 책의 샘플 프로그램 ... 9
이 책의 그림에 개해서 ... 19
00 리팩토링이란
   리팩토링이란
      리팩토링의 정의 ... 28
      리팩토링 퀴즈 ... 28
      리팩토링과 유닛테스트(Unit test) ... 29
      리팩토링의 목적 ... 30
      리팩토링의 한계 ... 32
   리팩토링과 코드의 악취 ... 33
      코드릐 악취란 ... 33
      코드의 악취를 나타내는 표현 ... 35
   리팩토링 카탈로그 ... 39
      리팩토링 카탈로그란 ... 39
      조직적 수정 ... 39
   리팩토링의 에센스 ... 40
      Step by Step: 한 번에 2개씩 수정하지 않는다 ... 40
      Step by Step: 후에 돌아오기 쉽게 ... 41
      Step by Step: 단계마다 확인 ... 41
step by step: 오래된 것을 새로운 것으로 바꿔가자 ... 42
   리팩토링 Q&A ... 42
      리팩토링은 만병통치약인가 ... 42
      리팩토링을 배우는 것은 가치가 있는가 ... 43
      움직이는 코드에 손을 대는 것은 좋은 것인가? ... 43
      어디까지가 '외부'인가 ... 44
      초기 설계를 제대로 해두는 것이 유효하지 않을까 ... 44
      적절한 리팩토링을 발견하는 것은 ... 45
      모두 기억할 필요가 있는가 ... 45
      익스트림 프로그래밍과 관계가 있는가 ... 46
      디자인 패턴과 관계가 있는가 ... 46
      지금의 현장 업부에서 리팩토링은 어렵다? ... 46
   연습문제 ... 48
01 소스에 '100'이라고 쓰여져 있다면 매직넘버를 심볼릭 정수로 치환하기
   리팩토링 ... 50
      매직넘버는 심볼릭 정수로 치환하기 ... 50
   샘플 프로그램 ... 53
      리팩토링전 ... 53
      리팩토링 실행 ... 56
      리팩토링후 ... 59
   생각 넓히기 ... 61
      타입코드를 클래스로 치환하기 ... 61
      enum ... 63
      심볼릭 정수로 하지 말아야 하는 경우 ... 64
      바이트코드에 쓰여있는 정수에 주의 ... 65
   연습문제 ... 67
02 제어 플래그 때문에 코드를 읽기 힘들다면 제어 플래그의 삭제
   리팩토링 ... 70
      제어 플래그의 삭제 ... 70
   샘플 프로그램(Findint) ... 72
      리팩토링전 ... 72
      리팩토링실행(break를 사용하는 경우) ... 74
      리팩토링 실핼(retum을 사용하는 경우) ... 75
   샘플 프로그램(SimpleDatabase) ... 76
      리팩토링전 ... 77
      리팩토링 실행 ... 79
   생각 넓히기 ... 82
break나 retum으로 인해 가족성이 높아지는 이유 ... 82
      인스턴트 필드로 된 제어 플래그의 위험성 ... 83
      플래그의 이름 ... 84
boolean 이외의 플래그 ... 85
      정규표현 패키지를 사용해 보면 ... 85
   연습문제 ... 88
03 '이것이 성립될 것'이라고 하는 주석이 있으면 assertion의 도입
   리팩토링 ... 90
      assertion의 도입 ... 90
   샘플 프로그램 ... 92
      리팩토링전 ... 92
      리팩토링 실행 ... 95
      리팩토링후 ... 96
      컴파일과 실행 ... 98
      assertion의 동작 확인하기 ... 100
   생각 넓히기 ... 102
      Jave의 assertion 기법 ... 102
      assertion은 오류처리 대신에는 쓸 수 없다 ... 104
      Jave의 assertion은 클래스 라이브러리가 아니다 ... 104
      assertion의 완전 삭제 ... 105
      그외의 언어 환경에서의 assertion ... 105
   연습문제 ... 106
04 Null 체크가 너무 많다면 NULL 오브젝트 도입
   리팩토링 ... 108
      Null 오브젝트의 조입 ... 108
   샘플 프로그램 ... 110
      리팩토링전 ... 111
      리팩토링 실행 ... 114
   리팩토링후 ... 118
   생각 넓히기 ... 120
      Factory Method 패턴 ... 120
      Singleton 패턴 ... 120
      Null 오브젝트로 네스트란 클래스를 사용 ... 120
      Null 체크는 모두 나쁘다? ... 123
      패턴광이 되지 않게 ... 123
      정수로서의 Null 오브젝트 ... 124
      isNull 메소드는 필요한 것인가 ... 125
      원래 클래스를 수정할 수 없을 때는 어떻게 할까? ... 125
   연습문제 ... 126
05 코드가 너무 길어 읽기 힘들다면 메소드의 추출
   리팩토링 ... 128
      메소드의 추출 ... 128
   샘플 프로그램 ... 131
      리팩토링전 ... 131
      리팩토링 실행 ... 133
      리팩토링후 ... 136
   생각 넓히기 ... 138
      역 리팩토링 ... 138
      메소드의 추출은 당연하다? ... 138
      메소드는 길어져 가는 것 ... 139
   연습문제 ... 141
06 클래스의 책임이 너무 많다면 클래스의 추출
   리팩토링 ... 144
      클래스의 추출 ... 144
   샘플 프로그램 ... 148
      리팩토링전 ... 149
      리팩토링 실행 ... 152
      리팩토링후 ... 156
   생각 넓히기 ... 158
      쌍방향 링크는 피한다 ... 158
      기능추가와 리팩토링 ... 158
      Immutable Interface ... 159
      역 리팩토링 클래스의 인라인화 ... 161
   연습문제 ... 162
07 오브젝트 식별에 int가 사용되고 있다면 타입코드를 클래스로 치환하기
   리팩토링 ... 164
      타입코드를 클래스로 치환하기 ... 164
   샘플 프로그램 ... 167
      리팩토링전 ... 168
      기본형을 사용하는 타입코드의 문제점 ... 170
      리팩토링 실행 ... 171
      리팩토링후 ... 174
   생각 넓히기 ... 177
      기본형을 사용한 타입코드의 문제점 ... 177
      enum ... 177
   연습문제 ... 179
08 타입코드마다 동작이 다르다면(1) 타입코드를 서브클래스로 치환하기
   리팩토링 ... 182
      타입코드를 서브클래스로 치환 ... 182
      구조와 동작 ... 185
   샘플 프로그램 ... 186
      리팩토링전 ... 186
      리팩토링 실행 ... 190
      리팩토링 후 ... 192
   생각 넓히기 ... 196
switch문과 instanceof 연산자는 코드의 악취가 난다 ... 196
      오브젝트만 생성하는 switch문은 삭제 ... 196
      Factory Method를 여러 개 준비한다 ... 198
      어디까지 리팩토링해야 하는가 ... 199
   연습문제 ... 201
09 타입코드마다 동작이 다르다면(2) 타입코드를 State/Strategy로 치환하기
   리팩토링 ... 204
      타입코드를 State/Strategy로 치환하기 ... 204
   샘플 프로그램 ... 208
      리팩토링전 ... 208
      리팩토링 실행 ... 212
      리팩토링후 ... 216
   코드의 추가 수정 ... 218
      enum 사용하기 ... 219
      상태의존 코드를 상태 오브젝트로 이동하기 ... 220
      정리하기 ... 222
   생각 넓히기 ... 224
      타입코드를 치환한 3개의 방법 비교 ... 224
      'State 패턴'과 Strategy 패턴'의 차이점 ... 225
      다형적인 해결과 default의 소실 ... 226
   연습문제 ... 227
10 오류 처리가 어지럽게 흩어져 있다면 오류 코드를 예외로 치환하기
   리팩토링 ... 230
      오류 코드를 예외로 치환하기 ... 230
   샘플 프로그램 ... 232
      리팩토링전 ... 233
      리팩토링 실행 ... 240
      리팩토링후 ... 243
   코드의 추가 수정 ... 246
      타입코드를 State/Strategy로 치환하기 ... 246
   생각 넓히기 ... 251
      체크되는 예외와 체크되지 않는 예외 ... 251
      예외의 계층 ... 252
      Java.io.EOFException을 둘러싼 ... 253
      체크되지 않는 예외와 사전 체크용 메소드 ... 254
      오류 아토믹성 ... 255
   연습문제 ... 256
11 클래스명이 new로 하드코딩 되어 있다면 생성자를 Factory Method로 치환하기
   리팩토링 ... 258
      생성자를 Factory Method로 치환하기 ... 258
   샘플 프로그램 ... 261
      리팩토링전 ... 262
      리팩토링 실행 ... 267
      리팩토링후 ... 268
      타입코드를 서브클래스로 치환하는 리팩토링의 실핼 ... 271
      리팩토링후 ... 272
   생각 넓히기 ... 275
      프로바이더(provider) ... 275
      인수의 문제 ... 276
      Factory Method와 Creation Method ... 277
   연습문제 ... 278
12 모델과 뷰가 혼재되어 있다면 관찰되는 데이터의 복제
   리팩토링 ... 282
      관찰되는 데이터의 복제 ... 282
   샘플 프로그램 ... 285
      리팩토링전 ... 286
      리팩토링 실행 ... 289
      리팩토링후 ... 294
   생각 넓히기 ... 297
      이벤트에 포함된 정보 ... 297
      무엇을 이벤트 리스너로 할까 ... 298
      무한 루프에 주의 ... 298
      별도의 이벤트 리스너 추가 ... 299
   연습문제 ... 304
13 IS-A 관계가 아님에도 불구하고 상속하고 있다면 상속을 위임으로 치환하기
   상속과 위임 ... 306
      상속 ... 306
      위임 ... 307
      상속과 위임의 비교 ... 307
   리팩토링 ... 308
      상속을 위임으로 치환하기 ... 308
   샘플 프로그램 ... 311
      리팩토링전 ... 312
      의문 ... 316
      리팩토링 실행 ... 317
      리팩토링후 ... 319
      Chain Constructors ... 321
   생각 넓히기 ... 322
      상속은 최후의 무기 ... 322
      리스코프의 치환원칙 ... 323
      IS-A 관계와 HAS-A 관계 ... 324
   연습문제 ... 325
14 위임 클래스까지 보인다면 위임의 은폐
   리팩토링 ... 328
      위임의 은폐 ... 328
   샘플 프로그램 ... 331
      리팩토링전 ... 333
      첫 번째 리팩토링의 실행 ... 336
      첫 번째 리팩토링후 ... 338
      두 번째 리팩토링 실행 ... 340
      두 번째 리팩토링후 ... 342
   생각 넓히기 ... 343
      숨기는 것의 중요성 ... 343
      다양한 은패 ... 344
   중개자의 삭제 ... 347
      클래스의 인라인화 ... 348
   연습문제 ... 349
15 상속이 얽혀 있다면 상속의 분할
   리팩토링 ... 352
      상속의 분할 ... 352
   샘플 프로그램 ... 355
      리팩토링전 ... 357
      의문점 ... 363
      리팩토링 실행 ... 364
      리팩토링후 ... 370
   생각 넓히기 ... 375
      직교성 ... 375
      상속과Override ... 377
   연습문제 ... 380
부록 A 리팩토링 목록 ... 381
부록 B Junit ... 421
부록 C 참고문서와 웹사이트 ... 433
연습문제 해답 ... 437
찾아보기 ... 465
닫기