CHAPTER 1 클린 코드_1.1 코드 스멜이란 무엇인가요?_1.2 리팩터링은 무엇인가요?_1.3 레시피는 무엇인가요?_1.4 왜 클린 코드인가요?_1.5 가독성, 성능 혹은 둘 다_1.6 소프트웨어 유형_1.7 기계 생성 코드_1.8 이 책에서 사용하는 표현_1.9 디자인 패턴_1.10 프로그래밍 언어 패러다임_1.11 객체 vs. 클래스_1.12 변경성CHAPTER 2 공리 설정_2.0 소개_2.1 왜 모델인가요?_2.2 왜 추상적인가요?_2.3 왜 프로그래밍이 가능해야 하나요?_2.4 왜 부분적인가요?_2.5 왜 설명 가능해야 하나요?_2.6 왜 현실에 관한 것인가요?_2.7 규칙 유추하기_2.8 유일무이한 소프트웨어 설계 원칙CHAPTER 3 빈약한 모델_3.0 소개_3.1 빈약한 객체를 풍성한 객체로 변환하기_3.2 객체의 본질 파악하기_3.3 객체에서 세터 제거하기_3.4 빈약한 코드 생성기 제거하기_3.5 자동으로 구현된 속성 제거하기_3.6 DTO 제거하기_3.7 빈 생성자 완성하기_3.8 게터 제거하기_3.9 객체의 난장판 방지하기_3.10 동적 속성 제거하기CHAPTER 4 기본형 집착_4.0 소개_4.1 작은 객체 생성하기_4.2 기본형 데이터 구체화하기_4.3 연관 배열 재구성하기_4.4 문자열 남용 제거하기_4.5 타임스탬프 구체화하기_4.6 하위 집합을 객체로 구체화하기_4.7 문자열 유효성 검증 구체화하기_4.8 불필요한 속성 제거하기_4.9 날짜 구간 생성하기CHAPTER 5 가변성_5.0 소개_5.1 var를 const로 변경하기_5.2 변수를 가변적이게 선언하기_5.3 본질 변경 금지하기_5.4 변경 가능한 상수 배열 피하기_5.5 지연된 초기화 제거하기_5.6 변경 가능한 상수 고정하기_5.7 부작용 제거하기_5.8 호이스팅 방지하기CHAPTER 6 선언적 코드_6.0 소개_6.1 재사용 변수 범위 좁히기_6.2 빈 줄 제거하기_6.3 버전이 지정된 메서드 제거하기_6.4 이중 부정 제거하기_6.5 잘못 배치된 책임 변경하기_6.6 명시적 반복 대체하기_6.7 설계 결정 기록하기_6.8 매직 넘버를 상수로 바꾸기_6.9 ‘무엇’과 ‘어떻게’ 분리하기_6.10 정규 표현식 문서화하기_6.11 괴상한 조건문 재작성하기_6.12 저급한 메서드 제거하기_6.13 콜백 지옥에서 벗어나기_6.14 올바른 오류 메시지 생성하기_6.15 마법 변환 피하기CHAPTER 7 명명_7.0 소개_7.1 약어 확장하기_7.2 도우미와 유틸리티 이름 변경 및 분리하기_7.3 my-객체 이름 변경하기_7.4 result 변수 이름 변경하기_7.5 타입이 포함된 변수 이름 변경하기_7.6 긴 이름 변경하기_7.7 추상적인 이름 변경하기_7.8 맞춤법 오류 수정하기_7.9 속성에서 클래스명 제거하기_7.10 클래스와 인터페이스에서 첫 글자 제거하기_7.11 basic/do 함수 이름 바꾸기_7.12 복수형 클래스를 단수로 변환하기_7.13 이름에서 Collection 제거하기_7.14 클래스 이름에서 Impl 접두사/접미사 제거하기_7.15 역할에 따라 인수 이름 변경하기_7.16 중복된 매개변수 이름 제거하기_7.17 이름에서 불필요한 컨텍스트 제거하기_7.18 data 명칭 피하기CHAPTER 8 주석_8.0 소개_8.1 주석 처리된 코드 제거하기_8.2 더 이상 사용하지 않는 주석 제거하기_8.3 논리적인 주석 제거하기_8.4 게터 주석 제거하기_8.5 주석을 함수명으로 변환하기_8.6 메서드 내부 주석 제거하기_8.7 주석을 테스트로 대체하기CHAPTER 9 표준_9.0 소개_9.1 코딩 표준 준수하기_9.2 들여쓰기 표준화하기_9.3 대소문자 규칙 통일하기_9.4 영어로 코드 작성하기_9.5 매개변수 순서 통일하기_9.6 깨진 유리창 수정하기CHAPTER 10 복잡성_10.0 소개_10.1 반복되는 코드 제거하기_10.2 설정/구성 및 기능 토글 제거하기_10.3 속성으로 상태 변경하기_10.4 코드에서 교묘함 제거하기_10.5 다중 프라미스 끊기_10.6 긴 협업 체인 끊기_10.7 메서드를 객체로 추출하기_10.8 배열 생성자 관리하기_10.9 폴터가이스트 객체 제거하기CHAPTER 11 블로터_11.0 소개_11.1 너무 긴 메서드 나누기_11.2 과도한 인수 줄이기_11.3 과도한 변수 줄이기_11.4 과도한 괄호 제거하기_11.5 과도한 메서드 제거하기_11.6 너무 많은 속성 나누기_11.7 import 목록 줄이기_11.8 and 함수 나누기_11.9 뚱뚱한 인터페이스 분리하기CHAPTER 12 YAGNI 원칙_12.0 소개_12.1 불필요한 코드 제거하기_12.2 다이어그램 대신 코드 사용하기_12.3 하나의 하위 클래스를 가진 클래스 리팩터링하기_12.4 일회성 인터페이스 제거하기_12.5 디자인 패턴 남용 제거하기_12.6 비즈니스 컬렉션 대체하기CHAPTER 13 빠른 실패_13.0 소개_13.1 재할당 변수 리팩터링하기_13.2 전제 조건 적용하기_13.3 더 엄격한 매개변수 사용하기_13.4 switch 문에서 기본값 제거하기_13.5 순회하는 동안 컬렉션 수정 방지하기_13.6 해시와 동등성 재정의하기_13.7 기능 변경 없이 리팩터링하기CHAPTER 14 if 문_14.0 소개_14.1 우발적 if 문을 다형성으로 대체하기_14.2 이벤트의 플래그 변수 이름 변경하기_14.3 boolean 변수 재구성하기_14.4 switch/case/else if 문 대체하기_14.5 하드코딩된 if 조건문을 컬렉션으로 대체하기_14.6 boolean을 단락 평가 조건으로 변경하기_14.7 암시적 else 추가하기_14.8 조건부 화살표 코드 재작성하기_14.9 무분별한 단락 평가 방지하기_14.10 중첩된 화살표 코드 재작성하기_14.11 조건 검사를 위한 boolean 값 반환 방지하기_14.12 boolean 비교 변경하기_14.13 긴 삼항식에서 추출하기_14.14 비다형성 함수를 다형성으로 변환하기_14.15 동등 비교 변경하기_14.16 하드코딩된 비즈니스 조건 재정의하기_14.17 불필요한 boolean 제거하기_14.18 중첩된 삼항식 재작성하기CHAPTER 15 null_15.0 소개_15.1 null 객체 생성하기_15.2 선택적 체이닝 제거하기_15.3 선택적 속성을 컬렉션으로 변환하기_15.4 실제 객체로 null 대체하기_15.5 null을 사용하지 않고 알려지지 않은 위치 표현하기CHAPTER 16 섣부른 최적화_16.0 소개_16.1 객체 ID 피하기_16.2 섣부른 최적화 제거하기_16.3 비트 단위의 섣부른 최적화 제거하기_16.4 과도한 일반화 줄이기_16.5 구조적 최적화 변경하기_16.6 앵커 보트 제거하기_16.7 도메인 객체에서 캐시 추출하기_16.8 구현에 기반한 콜백 이벤트 제거하기_16.9 생성자에서 쿼리 제거하기_16.10 소멸자에서 코드 제거하기CHAPTER 17 결합도_17.0 소개_17.1 숨겨진 가정을 명시적으로 표현하기_17.2 싱글턴 대체하기_17.3 신 객체 나누기_17.4 확산적 변경 나누기_17.5 특수 플래그 값을 일반값으로 변환하기_17.6 산탄총 수술 제거하기_17.7 선택적 인수 제거하기_17.8 기능에 대한 욕심 방지하기_17.9 중간자 제거하기_17.10 기본 인수를 맨 끝으로 이동하기_17.11 파급 효과 피하기_17.12 비즈니스 객체에서 우발적 메서드 제거하기_17.13 사용자 인터페이스에서 비즈니스 코드 제거하기_17.14 결합을 클래스로 대체하기_17.15 데이터 덩어리 리팩터링하기_17.16 부적절한 친밀성 분리하기_17.17 대체 가능한 객체 대체하기CHAPTER 18 전역_18.0 소개_18.1 전역 함수 구체화하기_18.2 정적 함수 구체화하기_18.3 goto를 구조화된 코드로 대체하기_18.4 전역 클래스 제거하기_18.5 전역 날짜 생성 변경하기CHAPTER 19 계층_19.0 소개_19.1 깊은 상속 끊기_19.2 요요 계층 분리하기_19.3 코드 재사용을 위한 하위 분류 나누기_19.4 is-a 관계를 동작으로 변경하기_19.5 중첩 클래스 제거하기_19.6 격리된 클래스 이름 변경하기_19.7 구상 클래스를 final로 만들기_19.8 클래스 상속 명시적으로 정의하기_19.9 비어 있는 클래스 마이그레이션하기_19.10 섣부른 분류 지연하기_19.11 protected 속성 제거하기_19.12 비어 있는 구현 완성시키기CHAPTER 20 테스트_20.0 소개_20.1 private 메서드 테스트하기_20.2 어서션에 설명 추가하기_20.3 assertTrue를 특정 어서션으로 마이그레이션하기_20.4 모의 객체를 실제 객체로 대체하기_20.5 일반 어서션 다듬기_20.6 불규칙한 테스트 제거하기_20.7 부동 소수점에 대한 어서션 변경하기_20.8 테스트 데이터를 실제 데이터로 변경하기_20.9 캡슐화를 위반하는 테스트 보호하기_20.10 관련 없는 테스트 정보 제거하기_20.11 모든 병합 요청에 대해 커버리지 추가하기_20.12 날짜에 의존하는 테스트 재작성하기_20.13 새로운 프로그래밍 언어 배우기CHAPTER 21 기술 부채_21.0 소개_21.1 프로덕션 종속 코드 제거하기_21.2 결함 목록 제거하기_21.3 경고/엄격 모드 해제 제거하기_21.4 TODO와 FIXME 방지 및 제거하기CHAPTER 22 예외_22.0 소개_22.1 비어 있는 예외 블록 제거하기_22.2 불필요한 예외 제거하기_22.3 예상 가능한 상황을 위한 예외 재작성하기_22.4 중첩된 try/catch 재작성하기_22.5 반환 코드를 예외로 대체하기_22.6 예외 화살표 코드 재작성하기_22.7 최종 사용자로부터 저수준 오류 숨기기_22.8 예외 시도 범위 좁히기CHAPTER 23 메타프로그래밍_23.0 소개_23.1 메타프로그래밍 사용처 제거하기_23.2 익명 함수 재정의하기_23.3 전처리 제거하기_23.4 동적 메서드 제거하기CHAPTER 24 타입_24.0 소개_24.1 타입 검사 제거하기_24.2 참 같은 값 다루기_24.3 부동 소수점을 십진수로 변경하기CHAPTER 25 보안_25.0 소개_25.1 입력값 검열하기_25.2 순차적 ID 변경하기_25.3 패키지 의존성 제거하기_25.4 악의적인 정규 표현식 대체하기_25.5 객체 역직렬화 방지하기용어 사전