{"product_id":"110482","title":"디자인 패턴의 아름다움","description":"\u003ccenter\u003e\u003cdiv style=\"text-align:center\"\u003e\u003cimg src=\"https:\/\/tmgdisk01.cafe24.com\/images\/vs\/4172\/sv\/3jYEEJvOPWDW6Z0klqTe6J10JJ1RVv.png?v=1765103779\" style=\"max-width:100%;max-height:10px\"\u003e\u003c\/div\u003e\u003c\/center\u003e\u003ccenter\u003e\u003ctable\u003e\u003ctr\u003e\u003ctd style=\"height:10px\"\u003e\u003c\/td\u003e\u003c\/tr\u003e\u003c\/table\u003e\u003c\/center\u003e\u003ccenter\u003e\u003ctable\u003e\u003ctr\u003e\u003ctd style=\"height:10px\"\u003e\u003c\/td\u003e\u003c\/tr\u003e\u003c\/table\u003e\u003c\/center\u003e\u003ccenter\u003e\n\u003cdiv style=\"width:95%\"\u003e\n\u003cdiv style=\"text-align:center;font-size:30px;font-weight:bolder;line-height:1.6em\"\u003e디자인 패턴의 아름다움\u003c\/div\u003e\n\u003ccenter\u003e\u003ctable\u003e\u003ctr\u003e\u003ctd style=\"height:10px\"\u003e\u003c\/td\u003e\u003c\/tr\u003e\u003c\/table\u003e\u003c\/center\u003e\n\u003ccenter\u003e\u003ctable\u003e\u003ctr\u003e\u003ctd style=\"height:10px\"\u003e\u003c\/td\u003e\u003c\/tr\u003e\u003c\/table\u003e\u003c\/center\u003e\n\u003ccenter\u003e\u003ctable\u003e\u003ctr\u003e\u003ctd style=\"height:10px\"\u003e\u003c\/td\u003e\u003c\/tr\u003e\u003c\/table\u003e\u003c\/center\u003e\n\u003ccenter\u003e\u003ctable\u003e\u003ctr\u003e\u003ctd style=\"height:10px\"\u003e\u003c\/td\u003e\u003c\/tr\u003e\u003c\/table\u003e\u003c\/center\u003e\n\u003cdiv style=\"border-bottom:1px;border-bottom-style:dotted;border-color:;padding-bottom:20px\"\u003e\u003ccenter\u003e\u003ctable align=\"center\" width=\"100%\"\u003e\u003ctbody style=\"border:0px\"\u003e\n\u003ctr\u003e\u003ctd align=\"center\" style=\"line-height:1.2em;text-align:center;font-size:18px;color:black;font-weight:bold;padding-bottom:20px;\"\u003e\u003c\/td\u003e\u003c\/tr\u003e\n\u003ctr\u003e\u003ctd style=\"text-align:center\"\u003e\u003cimg src=\"https:\/\/image.yes24.com\/goods\/118859035\/XL\" style=\"max-width:100%;height:auto\"\u003e\u003c\/td\u003e\u003c\/tr\u003e\n\u003c\/tbody\u003e\u003c\/table\u003e\u003c\/center\u003e\u003c\/div\u003e\n\u003ccenter\u003e\u003ctable\u003e\u003ctr\u003e\u003ctd style=\"height:10px\"\u003e\u003c\/td\u003e\u003c\/tr\u003e\u003c\/table\u003e\u003c\/center\u003e\n\u003ccenter\u003e\u003ctable\u003e\u003ctr\u003e\u003ctd style=\"height:10px\"\u003e\u003c\/td\u003e\u003c\/tr\u003e\u003c\/table\u003e\u003c\/center\u003e\n\u003cdiv style=\"width:95%;{split_style6}padding-top:20px;padding-bottom:20px\"\u003e\n\u003cdiv style=\"text-align:left;font-size:16px;font-weight:bold;padding-bottom:20px\"\u003eDescription\u003c\/div\u003e\n\u003cdiv style=\"text-align:left;word-break:break-all;font-size:14px;line-height:1.6em;\"\u003e\n\u003cdiv\u003e \u003ch5\u003e\u003cb\u003e책소개\u003c\/b\u003e\u003c\/h5\u003e \u003c\/div\u003e \u003cdiv\u003e \u003cdiv\u003e \u003cdiv\u003e  \u003cb\u003e구글러의 코드 품질 관리 비법을 공개한다\u003c\/b\u003e\u003cbr\u003e\u003cbr\u003e코드의 품질을 매우 중요시했던 구글러들은 코드에 달린 주석에서 작은 마침표 오류까지 수정을 요청하기에 이르렀고, 그만큼 엄격했던 코드 품질 관리 덕분에 프로젝트의 유지 관리 비용이 매우 낮아졌다.\u003cbr\u003e이와 같은 경험을 집대성한 이 책에서는 200여 개의 실제 프로젝트 사례를 바탕으로 객체지향 패러다임, 설계 원칙, 코딩 규칙, 리팩터링 기법, 디자인 패턴의 5가지 측면에서 고품질의 코드 작성 방법을 상세히 배울 수 있다.\u003cbr\u003e\n\u003c\/div\u003e \u003c\/div\u003e \u003cdiv\u003e \u003cul\u003e \u003cli\u003e 책의 일부 내용을 미리 읽어보실 수 있습니다.\u003cbr\u003e\u003cspan\u003e미리보기\u003c\/span\u003e\n\u003c\/li\u003e \u003c\/ul\u003e \u003c\/div\u003e \u003c\/div\u003e \u003cbr\u003e\u003cdiv\u003e \u003ch5\u003e\u003cb\u003e목차\u003c\/b\u003e\u003c\/h5\u003e \u003c\/div\u003e \u003cdiv\u003e \u003cdiv\u003e  옮긴이 머리말 xiii\u003cbr\u003e베타리더 후기 xiv\u003cbr\u003e시작하며 xvi\u003cbr\u003e\u003cbr\u003e\u003cb\u003eCHAPTER 1 개요 1\u003cbr\u003e\u003c\/b\u003e\u003cbr\u003e1.1 코드 설계를 배우는 이유 1\u003cbr\u003e__1.1.1 고품질의 코드 작성 2 \/ 1.1.2 복잡한 코드 개발 다루기 2\u003cbr\u003e__1.1.3 프로그래머의 기본 능력 4 \/ 1.1.4 경력 개발에 필요한 기술 5\u003cbr\u003e__1.1.5 생각해보기 5\u003cbr\u003e1.2 코드 품질 평가 방법 6\u003cbr\u003e__1.2.1 유지 보수성 8 \/ 1.2.2 가독성 9 \/ 1.2.3 확장성 10 \/ 1.2.4 유연성 10\u003cbr\u003e__1.2.5 간결성 11 \/ 1.2.6 재사용성 11 \/ 1.2.7 테스트 용이성 12 \/ 1.2.8 생각해보기 12\u003cbr\u003e1.3 고품질 코드를 작성하는 방법 12\u003cbr\u003e__1.3.1 객체지향 13 \/ 1.3.2 설계 원칙 13 \/ 1.3.3 디자인 패턴 14\u003cbr\u003e__1.3.4 코딩 규칙 15 \/ 1.3.5 리팩터링 기법 15 \/ 1.3.6 생각해보기 17\u003cbr\u003e1.4 과도한 설계를 피하는 방법 18\u003cbr\u003e__1.4.1 코드 설계의 원래 의도는 코드 품질을 향상시키는 것이다 18\u003cbr\u003e__1.4.2 코드 설계의 원칙은 앞에 문제가 있고, 뒤에 방안이 있다는 것이다 18\u003cbr\u003e__1.4.3 코드 설계의 응용 시나리오는 복잡한 코드에 적용되어야 한다 19\u003cbr\u003e__1.4.4 지속적인 리팩터링은 과도한 설계를 효과적으로 방지할 수 있다 20\u003cbr\u003e__1.4.5 특정 시나리오 외의 코드 설계에 대해 이야기하지 않는다 20\u003cbr\u003e__1.4.6 생각해보기 21\u003cbr\u003e\u003cbr\u003e\u003cb\u003eCHAPTER 2 객체지향 프로그래밍 패러다임 23\u003cbr\u003e\u003c\/b\u003e\u003cbr\u003e2.1 객체지향이란 무엇인가? 23\u003cbr\u003e__2.1.1 객체지향 프로그래밍과 객체지향 프로그래밍 언어 23\u003cbr\u003e__2.1.2 엄격하게 정의되지 않은 객체지향 프로그래밍 언어 25\u003cbr\u003e__2.1.3 객체지향 분석과 객체지향 설계 26\u003cbr\u003e__2.1.4 UML에 대한 참고 사항 27\u003cbr\u003e__2.1.5 생각해보기 28\u003cbr\u003e2.2 캡슐화, 추상화, 상속, 다형성이 등장한 이유 28\u003cbr\u003e__2.2.1 캡슐화 28 \/ 2.2.2 추상화 31 \/ 2.2.3 상속 33 \/\u003cbr\u003e__2.2.4 다형성 35 \/ 2.2.5 생각해보기 39\u003cbr\u003e2.3 객체지향 분석, 객체지향 설계, 객체지향 프로그래밍을 수행하는 방법 40\u003cbr\u003e__2.3.1 예제 소개와 난이도 분석 40\u003cbr\u003e__2.3.2 객체지향 분석 수행 방법 41\u003cbr\u003e__2.3.3 객체지향 설계 방법 45\u003cbr\u003e__2.3.4 객체지향 프로그래밍을 하는 방법 53\u003cbr\u003e__2.3.5 생각해보기 55\u003cbr\u003e2.4 객체지향 프로그래밍, 절차적 프로그래밍, 함수형 프로그래밍의 차이 55\u003cbr\u003e__2.4.1 절차적 프로그래밍 55\u003cbr\u003e__2.4.2 객체지향 프로그래밍과 절차적 프로그래밍의 비교 59\u003cbr\u003e__2.4.3 함수형 프로그래밍 62\u003cbr\u003e__2.4.4 객체지향 프로그래밍과 함수형 프로그래밍의 비교 69\u003cbr\u003e__2.4.5 생각해보기 69\u003cbr\u003e2.5 객체지향 프로그래밍처럼 보이지만 실제로는 절차적 프로그래밍 70\u003cbr\u003e__2.5.1 getter, setter 메서드 남용 70\u003cbr\u003e__2.5.2 전역 변수와 전역 메서드의 남용 74\u003cbr\u003e__2.5.3 데이터와 메서드 분리로 클래스 정의하기 77\u003cbr\u003e__2.5.4 생각해보기 79\u003cbr\u003e2.6 빈약한 도메인 모델에 기반한 전통적인 개발 방식은 OOP를 위반하는가? 79\u003cbr\u003e__2.6.1 빈약한 도메인 모델에 기반한 전통적인 개발 방식 80\u003cbr\u003e__2.6.2 풍성한 도메인 모델에 기반한 DDD 개발 방식 82\u003cbr\u003e__2.6.3 두 가지 개발 방식의 비교 83\u003cbr\u003e__2.6.4 빈약한 도메인 모델에 기반한 전통적인 개발 방식이 널리 사용되는 이유 90\u003cbr\u003e__2.6.5 풍성한 도메인 모델에 기반한 DDD 개발 방식의 응용 시나리오 91\u003cbr\u003e__2.6.6 생각해보기 92\u003cbr\u003e2.7 추상 클래스와 인터페이스 93\u003cbr\u003e__2.7.1 추상 클래스와 인터페이스의 정의와 차이점 93\u003cbr\u003e__2.7.2 추상 클래스와 인터페이스의 의미 97\u003cbr\u003e__2.7.3 추상 클래스와 인터페이스의 모의 구현 100\u003cbr\u003e__2.7.4 추상 클래스와 인터페이스의 응용 시나리오 102\u003cbr\u003e__2.7.5 생각해보기 102\u003cbr\u003e2.8 인터페이스 기반 프로그래밍:\u003cbr\u003e모든 클래스에 대해 인터페이스를 정의해야 할까? 102\u003cbr\u003e__2.8.1 인터페이스를 이해하는 다양한 방법 103\u003cbr\u003e__2.8.2 설계 철학을 실제로 적용해보자 104\u003cbr\u003e__2.8.3 인터페이스의 남용을 방지하려면 어떻게 해야 할까? 108\u003cbr\u003e__2.8.4 생각해보기 109\u003cbr\u003e2.9 상속보다 합성 109\u003cbr\u003e__2.9.1 상속이 더 이상 사용되지 않는 이유 109\u003cbr\u003e__2.9.2 합성이 상속에 비해 나은 장점 112\u003cbr\u003e__2.9.3 합성을 사용할지 상속을 사용할지 결정하기 114\u003cbr\u003e__2.9.4 생각해보기 115\u003cbr\u003e\u003cbr\u003e\u003cb\u003eCHAPTER 3 설계 원칙 117\u003cbr\u003e\u003c\/b\u003e\u003cbr\u003e3.1 단일 책임 원칙 117\u003cbr\u003e__3.1.1 단일 책임 원칙의 정의 및 해석 117\u003cbr\u003e__3.1.2 클래스에 단일 책임이 있는지 판단하는 방법 118\u003cbr\u003e__3.1.3 클래스의 책임이 가능한 한 자세하게 설명되어 있는지 여부 121\u003cbr\u003e__3.1.4 생각해보기 123\u003cbr\u003e3.2 개방 폐쇄 원칙 123\u003cbr\u003e__3.2.1 확장할 때는 개방, 수정할 때는 폐쇄 123\u003cbr\u003e__3.2.2 코드를 수정하는 것은 개방 폐쇄 원칙을 위반하는 것일까? 129\u003cbr\u003e__3.2.3 확장할 때는 개방, 수정할 때는 폐쇄를 달성하는 방법 131\u003cbr\u003e__3.2.4 프로젝트에 개방 폐쇄 원칙을 유연하게 적용하는 방법 133\u003cbr\u003e__3.2.5 생각해보기 134\u003cbr\u003e3.3 리스코프 치환 원칙 134\u003cbr\u003e__3.3.1 리스코프 치환 원칙의 정의 134\u003cbr\u003e__3.3.2 리스코프 치환 원칙과 다형성의 차이점 136\u003cbr\u003e__3.3.3 리스코프 치환 원칙을 위반하는 안티 패턴 137\u003cbr\u003e__3.3.4 생각해보기 139\u003cbr\u003e3.4 인터페이스 분리 원칙 139\u003cbr\u003e__3.4.1 API나 기능의 집합으로서의 인터페이스 139\u003cbr\u003e__3.4.2 단일 API나 기능으로서의 인터페이스 141\u003cbr\u003e__3.4.3 객체지향 프로그래밍에서의 인터페이스 142\u003cbr\u003e__3.4.4 생각해보기 149\u003cbr\u003e3.5 의존 역전 원칙 149\u003cbr\u003e__3.5.1 제어 반전 150 \/ 3.5.2 의존성 주입 152 \/ 3.5.3 의존성 주입 프레임워크 153\u003cbr\u003e__3.5.4 의존 역전 원칙 154 \/ 3.5.5 생각해보기 155\u003cbr\u003e3.6 KISS 원칙과 YAGNI 원칙 155\u003cbr\u003e__3.6.1 KISS 원칙의 정의와 해석 155\u003cbr\u003e__3.6.2 적은 줄 수의 코드가 더 간단하지 않다 156\u003cbr\u003e__3.6.3 복잡한 코드가 반드시 KISS 원칙을 위반하는 것은 아니다 158\u003cbr\u003e__3.6.4 KISS 원칙을 만족하는 코드 작성 방법 160\u003cbr\u003e__3.6.5 YAGNI 원칙과 KISS 원칙의 차이 160\u003cbr\u003e__3.6.6 생각해보기 161\u003cbr\u003e3.7 DRY 원칙 161\u003cbr\u003e__3.7.1 코드 논리의 중복 161 \/ 3.7.2 기능적(의미론적) 중복 164\u003cbr\u003e__3.7.3 코드 실행의 중복 165 \/ 3.7.4 코드 재사용성 167\u003cbr\u003e__3.7.5 생각해보기 169\u003cbr\u003e3.8 LoD 169\u003cbr\u003e__3.8.1 높은 응집도와 낮은 결합도에 대한 생각 169\u003cbr\u003e__3.8.2 LoD의 정의 171\u003cbr\u003e__3.8.3 정의 해석 및 첫 번째 예제 코드 171\u003cbr\u003e__3.8.4 정의 해석 및 두 번째 예제 코드 174\u003cbr\u003e__3.8.5 생각해보기 177\u003cbr\u003e\u003cbr\u003e\u003cb\u003eCHAPTER 4 코딩 규칙 179\u003cbr\u003e\u003c\/b\u003e\u003cbr\u003e4.1 명명과 주석 179\u003cbr\u003e__4.1.1 긴 이름과 짧은 이름 179\u003cbr\u003e__4.1.2 문맥 정보를 사용한 명명 단순화 180\u003cbr\u003e__4.1.3 비즈니스 용어집을 사용한 명명 통일 180\u003cbr\u003e__4.1.4 명명은 정확하지만 추상적이어야 한다 181\u003cbr\u003e__4.1.5 주석에 반드시 포함되어야 하는 것들 181\u003cbr\u003e__4.1.6 주석이 많다고 좋은 것은 아니다 183\u003cbr\u003e__4.1.7 생각해보기 183\u003cbr\u003e4.2 코드 스타일 184\u003cbr\u003e__4.2.1 클래스, 함수의 적절한 크기 184\u003cbr\u003e__4.2.2 한 줄의 적절한 길이 185\u003cbr\u003e__4.2.3 빈 줄을 활용한 코드 블록 구분 185\u003cbr\u003e__4.2.4 4칸 들여쓰기 혹은 2칸 들여쓰기 185\u003cbr\u003e__4.2.5 여는 중괄호는 어디에 놓여야 할까 186\u003cbr\u003e__4.2.6 클래스의 멤버 순서 186\u003cbr\u003e__4.2.7 생각해보기 187\u003cbr\u003e4.3 코딩 팁 187\u003cbr\u003e__4.3.1 복잡한 코드의 모듈화 187 \/ 4.3.2 함수의 매개변수 관리 188\u003cbr\u003e__4.3.3 함수의 플래그 매개변수 제거 189 \/ 4.3.4 깊은 중첩 코드 제거 191\u003cbr\u003e__4.3.5 설명 변수 194 \/ 4.3.6 생각해보기 195\u003cbr\u003e\u003cbr\u003e\u003cb\u003eCHAPTER 5 리팩터링 기법 197\u003cbr\u003e\u003c\/b\u003e\u003cbr\u003e5.1 리팩터링의 네 가지 요소: 목적, 대상, 시기, 방법 197\u003cbr\u003e__5.1.1 리팩터링의 목적 197 \/ 5.1.2 리팩터링의 대상 199\u003cbr\u003e__5.1.3 리팩터링의 시기 199 \/ 5.1.4 리팩터링의 방법 200\u003cbr\u003e__5.1.5 생각해보기 201\u003cbr\u003e5.2 단위 테스트 201\u003cbr\u003e__5.2.1 단위 테스트에 대해 201\u003cbr\u003e__5.2.2 단위 테스트 코드를 작성하는 이유 204\u003cbr\u003e__5.2.3 단위 테스트를 설계하는 방법 206\u003cbr\u003e__5.2.4 단위 테스트를 작성하기 어려운 이유 209\u003cbr\u003e__5.2.5 생각해보기 210\u003cbr\u003e5.3 코드 테스트 용이성 210\u003cbr\u003e__5.3.1 테스트 가능한 코드를 작성하는 방법 210\u003cbr\u003e__5.3.2 테스트가 불가능한 코드 220\u003cbr\u003e__5.3.3 생각해보기 222\u003cbr\u003e5.4 디커플링 223\u003cbr\u003e__5.4.1 디커플링이 중요한 이유 223\u003cbr\u003e__5.4.2 코드를 디커플링해야 하는지 판단하기 223\u003cbr\u003e__5.4.3 코드 디커플링 방법 224\u003cbr\u003e__5.4.4 생각해보기 227\u003cbr\u003e5.5 리팩터링 예제 227\u003cbr\u003e__5.5.1 ID 생성기의 요구 사항과 개발 배경 228\u003cbr\u003e__5.5.2 사용 가능한 수준의 코드 구현 228\u003cbr\u003e__5.5.3 코드 품질 문제를 찾는 방법 230\u003cbr\u003e__5.5.4 가독성 향상을 위한 리팩터링 232\u003cbr\u003e__5.5.5 코드 테스트 용이성 향상을 위한 리팩터링 234\u003cbr\u003e__5.5.6 단위 테스트 코드 작성을 위한 리팩터링 236\u003cbr\u003e__5.5.7 예외 처리를 위한 리팩터링 239\u003cbr\u003e__5.5.8 생각해보기 251\u003cbr\u003e\u003cbr\u003e\u003cb\u003eCHAPTER 6 생성 디자인 패턴 253\u003cbr\u003e\u003c\/b\u003e\u003cbr\u003e6.1 싱글턴 패턴 (1) 253\u003cbr\u003e__6.1.1 싱글턴 패턴의 정의 253 \/ 6.1.2 싱글턴 패턴의 구현 254\u003cbr\u003e__6.1.3 싱글턴 패턴의 적용 259 \/ 6.1.4 싱글턴 패턴의 단점 263\u003cbr\u003e__6.1.5 싱글턴 패턴의 대안 266 \/ 6.1.6 생각해보기 268\u003cbr\u003e6.2 싱글턴 패턴 (2) 268\u003cbr\u003e__6.2.1 싱글턴 패턴의 유일성 268\u003cbr\u003e__6.2.2 스레드 전용 싱글턴 패턴 269\u003cbr\u003e__6.2.3 클러스터 환경에서의 싱글턴 패턴 270\u003cbr\u003e__6.2.4 다중 인스턴스 패턴 272\u003cbr\u003e__6.2.5 생각해보기 273\u003cbr\u003e6.3 팩터리 패턴 (1) 273\u003cbr\u003e__6.3.1 단순 팩터리 패턴 274 \/ 6.3.2 팩터리 메서드 패턴 278\u003cbr\u003e__6.3.3 추상 팩터리 패턴 281 \/ 6.3.4 팩터리 패턴의 적용 대상 283\u003cbr\u003e__6.3.5 생각해보기 283\u003cbr\u003e6.4 팩터리 패턴 (2) 284\u003cbr\u003e__6.4.1 DI 컨테이너와 팩터리 패턴의 차이 284\u003cbr\u003e__6.4.2 DI 컨테이너의 핵심 기능 284\u003cbr\u003e__6.4.3 DI 컨테이너의 설계와 구현 287\u003cbr\u003e__6.4.4 생각해보기 292\u003cbr\u003e6.5 빌더 패턴 293\u003cbr\u003e__6.5.1 생성자를 사용한 객체 생성 293\u003cbr\u003e__6.5.2 setter 메서드를 사용한 멤버 변수 설정 295\u003cbr\u003e__6.5.3 빌더 패턴을 이용한 매개변수 검증 296\u003cbr\u003e__6.5.4 Guava에서 빌더 패턴 적용 299\u003cbr\u003e__6.5.5 빌더 패턴과 팩터리 패턴의 차이 301\u003cbr\u003e__6.5.6 생각해보기 301\u003cbr\u003e6.6 프로토타입 패턴 302\u003cbr\u003e__6.6.1 프로토타입 패턴의 정의 302\u003cbr\u003e__6.6.2 프로토타입 패턴의 적용 302\u003cbr\u003e__6.6.3 프로토타입 패턴의 구현 306\u003cbr\u003e__6.6.4 생각해보기 310\u003cbr\u003e\u003cbr\u003e\u003cb\u003eCHAPTER 7 구조 디자인 패턴 313\u003cbr\u003e\u003c\/b\u003e\u003cbr\u003e7.1 프록시 패턴 313\u003cbr\u003e__7.1.1 인터페이스 기반의 프록시 패턴 313\u003cbr\u003e__7.1.2 상속 기반의 프록시 패턴 316\u003cbr\u003e__7.1.3 리플렉션 기반의 동적 프록시 317\u003cbr\u003e__7.1.4 프록시 패턴의 활용 방법 318\u003cbr\u003e__7.1.5 생각해보기 320\u003cbr\u003e7.2 데커레이터 패턴: Java IO 라이브러리의 기본 설계 사상 분석 320\u003cbr\u003e__7.2.1 Java IO 라이브러리의 특이한 사용 방법 320\u003cbr\u003e__7.2.2 상속 기반 설계 322\u003cbr\u003e__7.2.3 데커레이터 패턴 기반 설계 계획 323\u003cbr\u003e__7.2.4 생각해보기 328\u003cbr\u003e7.3 어댑터 패턴 328\u003cbr\u003e__7.3.1 클래스 어댑터와 객체 어댑터 328\u003cbr\u003e__7.3.2 어댑터 패턴의 응용 330\u003cbr\u003e__7.3.3 자바 로깅과 어댑터 패턴 336\u003cbr\u003e__7.3.4 래퍼 패턴 338\u003cbr\u003e__7.3.5 생각해보기 342\u003cbr\u003e7.4 브리지 패턴 343\u003cbr\u003e__7.4.1 브리지 패턴의 정의 343\u003cbr\u003e__7.4.2 브리지 패턴으로 폭발적인 상속 해결하기 343\u003cbr\u003e__7.4.3 생각해보기 344\u003cbr\u003e7.5 퍼사드 패턴 344\u003cbr\u003e__7.5.1 퍼사드 패턴과 인터페이스 설계 345\u003cbr\u003e__7.5.2 퍼사드 패턴의 응용: 인터페이스 사용성 개선하기 346\u003cbr\u003e__7.5.3 퍼사드 패턴의 응용: 인터페이스 성능 향상하기 346\u003cbr\u003e__7.5.4 퍼사드 패턴의 응용: 트랜잭션 문제 해결하기 346\u003cbr\u003e__7.5.5 생각해보기 348\u003cbr\u003e7.6 복합체 패턴 348\u003cbr\u003e__7.6.1 복합체 패턴 기반의 디렉터리 트리 348\u003cbr\u003e__7.6.2 복합체 패턴 기반의 휴먼 트리 353\u003cbr\u003e__7.6.3 생각해보기 356\u003cbr\u003e7.7 플라이웨이트 패턴 356\u003cbr\u003e__7.7.1 체스 게임에서 플라이웨이트 패턴 적용 356\u003cbr\u003e__7.7.2 텍스트 편집기에서 플라이웨이트 패턴 적용 359\u003cbr\u003e__7.7.3 Java의 Integer에서 플라이웨이트 패턴 적용 362\u003cbr\u003e__7.7.4 Java의 String에서 플라이웨이트 패턴 적용 367\u003cbr\u003e__7.7.5 플라이웨이트 패턴과 싱글턴 패턴, 캐시, 오브젝트 풀의 차이 368\u003cbr\u003e__7.7.6 생각해보기 369\u003cbr\u003e\u003cbr\u003e\u003cb\u003eCHAPTER 8 행동 디자인 패턴 371\u003cbr\u003e\u003c\/b\u003e\u003cbr\u003e8.1 옵서버 패턴 371\u003cbr\u003e__8.1.1 옵서버 패턴의 정의 371\u003cbr\u003e__8.1.2 옵서버 패턴의 코드 구현 372\u003cbr\u003e__8.1.3 옵서버 패턴의 의미 373\u003cbr\u003e__8.1.4 옵서버 패턴의 적용 376\u003cbr\u003e__8.1.5 비동기식 비차단 옵서버 패턴 377\u003cbr\u003e__8.1.6 EventBus 프레임워크 379\u003cbr\u003e__8.1.7 EventBus 프레임워크를 처음부터 구현하기 382\u003cbr\u003e__8.1.8 생각해보기 388\u003cbr\u003e8.2 템플릿 메서드 패턴 (1) 388\u003cbr\u003e__8.2.1 템플릿 메서드 패턴의 정의와 구현 388\u003cbr\u003e__8.2.2 템플릿 메서드 패턴의 역할: 재사용 390\u003cbr\u003e__8.2.3 템플릿 메서드 패턴의 역할: 확장 392\u003cbr\u003e__8.2.4 생각해보기 395\u003cbr\u003e8.3 템플릿 메서드 패턴 (2) 396\u003cbr\u003e__8.3.1 콜백의 원리와 구현 396\u003cbr\u003e__8.3.2 JdbcTemplate 클래스 398\u003cbr\u003e__8.3.3 setClickListener() 메서드 401\u003cbr\u003e__8.3.4 addShutdownHook() 메서드 402\u003cbr\u003e__8.3.5 템플릿 메서드 패턴과 콜백의 차이점 404\u003cbr\u003e__8.3.6 생각해보기 405\u003cbr\u003e8.4 전략 패턴 405\u003cbr\u003e__8.4.1 전략 패턴의 정의와 구현 405\u003cbr\u003e__8.4.2 전략 패턴으로 분기 결정 대체 408\u003cbr\u003e__8.4.3 전략 패턴을 통한 파일 내용 정렬 410\u003cbr\u003e__8.4.4 전략 패턴의 오용 417\u003cbr\u003e__8.4.5 생각해보기 417\u003cbr\u003e8.5 책임 연쇄 패턴 417\u003cbr\u003e__8.5.1 책임 연쇄 패턴의 정의와 구현 417\u003cbr\u003e__8.5.2 책임 연쇄 패턴 기반의 민감 단어 필터링 423\u003cbr\u003e__8.5.3 책임 연쇄 패턴 기반의 서블릿 필터 426\u003cbr\u003e__8.5.4 책임 연쇄 패턴과 Spring의 인터셉터 430\u003cbr\u003e__8.5.5 책임 연쇄 패턴과 MyBatis 플러그인 432\u003cbr\u003e__8.5.6 생각해보기 439\u003cbr\u003e8.6 상태 패턴 439\u003cbr\u003e__8.6.1 유한 상태 기계란 무엇인가 439\u003cbr\u003e__8.6.2 분기 판단 방법으로 상태 머신 구현하기 442\u003cbr\u003e__8.6.3 테이블 조회 방법으로 상태 머신 구현하기 443\u003cbr\u003e__8.6.4 상태 패턴으로 상태 머신 구현하기 446\u003cbr\u003e__8.6.5 생각해보기 451\u003cbr\u003e8.7 반복자 패턴 (1) 451\u003cbr\u003e__8.7.1 반복자 패턴의 정의와 구현 451\u003cbr\u003e__8.7.2 컬렉션 순회 방법 454\u003cbr\u003e__8.7.3 반복자의 문제 456\u003cbr\u003e__8.7.4 반복자의 문제 해결 458\u003cbr\u003e__8.7.5 생각해보기 463\u003cbr\u003e8.8 반복자 패턴 (2) 464\u003cbr\u003e__8.8.1 스냅숏 기능을 지원하는 반복자 464\u003cbr\u003e__8.8.2 여러 복사본 기반의 설계 사상 466\u003cbr\u003e__8.8.3 시간값 기반의 설계 사상 466\u003cbr\u003e__8.8.4 생각해보기 470\u003cbr\u003e8.9 비지터 패턴 470\u003cbr\u003e__8.9.1 비지터 패턴의 도출 과정 470\u003cbr\u003e__8.9.2 이중 디스패치 481\u003cbr\u003e__8.9.3 생각해보기 484\u003cbr\u003e8.10 메멘토 패턴 485\u003cbr\u003e__8.10.1 메멘토 패턴의 정의 및 구현 485\u003cbr\u003e__8.10.2 시간과 공간 최적화 489\u003cbr\u003e__8.10.3 생각해보기 490\u003cbr\u003e8.11 커맨드 패턴 490\u003cbr\u003e__8.11.1 커맨드 패턴의 정의 490\u003cbr\u003e__8.11.2 모바일 게임 서버에 커맨드 패턴 적용 491\u003cbr\u003e__8.11.3 커맨드 패턴과 전략 패턴의 차이 494\u003cbr\u003e__8.11.4 생각해보기 494\u003cbr\u003e8.12 인터프리터 패턴 494\u003cbr\u003e__8.12.1 인터프리터 패턴의 정의 494\u003cbr\u003e__8.12.2 인터프리터 패턴으로 표현식 계산하기 495\u003cbr\u003e__8.12.3 인터프리터 패턴으로 규칙 엔진 개발하기 499\u003cbr\u003e__8.12.4 생각해보기 502\u003cbr\u003e8.13 중재자 패턴 502\u003cbr\u003e__8.13.1 중재자 패턴의 정의와 구현 503\u003cbr\u003e__8.13.2 중재자 패턴과 옵서버 패턴의 차이점 504\u003cbr\u003e__8.13.3 생각해보기 505\u003cbr\u003e\u003cbr\u003e찾아보기 506 \u003c\/div\u003e \u003cdiv\u003e\u003c\/div\u003e \u003c\/div\u003e \u003cbr\u003e\u003cdiv\u003e \u003ch5\u003e\u003cb\u003e상세 이미지\u003c\/b\u003e\u003c\/h5\u003e \u003c\/div\u003e \u003cdiv\u003e \u003cdiv\u003e \u003cimg src=\"https:\/\/image.yes24.com\/momo\/TopCate4176\/MidCate010\/417590834.jpg\" border=\"0\" alt=\"상세 이미지 1\"\u003e \u003c\/div\u003e \u003c\/div\u003e \u003cbr\u003e\u003cdiv\u003e \u003ch5\u003e\u003cb\u003e책 속으로\u003c\/b\u003e\u003c\/h5\u003e \u003c\/div\u003e \u003cdiv\u003e \u003cdiv\u003e \u003cdiv\u003e  우리는 종종 코드 품질에 주의를 기울여야 하고 코드를 작성하기 전에 코드 설계 단계를 무시하지 않아야 한다고 말한다.\u003cbr\u003e코드를 설계하지 않는 것은 좋지 않지만, 과도하게 설계하는 것도 좋지 않다.\u003cbr\u003e과거 업무 경험 동안 많은 동료를 겪었는데, 특히 코드를 과도하게 설계하고 디자인 패턴을 남용하는 것을 좋아하지만 개발 경험이 적은 엔지니어들이 있었다.\u003cbr\u003e그들은 코딩을 시작하기도 전에 코드 설계 작업에 오랜 시간을 할애한다.\u003cbr\u003e간단한 요구 사항이나 단순한 코드의 경우 코드가 더 유연하고 향후 확장을 위한 견고한 기반이 되기를 바라며 개발 프로세스에서 다양한 디자인 패턴을 적용하는 경우가 많다.\u003cbr\u003e하지만 과도한 설계는 나중에 요구 사항이 변하지 않을 수도 있기 때문에, 이런 시도는 코드의 복잡성만 높일 뿐이다.\u003cbr\u003e따라서 우리는 과도한 설계를 피하는 방법, 특히 객체지향 프로그래밍 패러다임, 설계 원칙, 코딩 규칙, 리팩터링과 같이 디자인 패턴의 남용을 피하는 방법에 대해 이야기할 필요가 있다.\u003cbr\u003e\u003cbr\u003e--- p.18\u003cbr\u003e\u003cbr\u003e그러나 일반적으로 대부분의 프로그래머는 종종 객체지향 분석과 객체지향 설계를 머릿속이나 간단한 스케치로 마친 후 바로 코드 작성을 시작할 뿐만 아니라, 코드 작성 도중에도 최적화와 리팩터링을 하는 경우가 많다.\u003cbr\u003e반대로 코드를 작성하기 전에 객체지향 분석과 설계에 많은 시간을 할애하고 단단한 클래스 다이어그램과 UML 다이어그램을 그렸더라도, 모든 세부 사항과 상호 작용에 대해 한 번에 다 정의하는 것은 불가능하다.\u003cbr\u003e코드를 작성하면서 여전히 코드를 뒤엎어 리팩터링하고, 또 이를 반복해야 한다.\u003cbr\u003e결국 소프트웨어 개발은 본질적으로 지속적인 반복, 패치, 문제 발견, 문제 해결의 과정이며, 지속적인 리팩터링의 과정이다.\u003cbr\u003e엄격하게 하나의 단계를 모두 마치고 다음 단계로 넘어가는 것이 불가능하다는 것을 알아야 한다.\u003cbr\u003e\u003cbr\u003e--- p.55\u003cbr\u003e\u003cbr\u003e리스코프 원칙에는 좀 더 이해하기 쉬운 설명 방식이 있는데, 바로 계약에 따른 설계(design by contract)라는 표현이다.\u003cbr\u003e하위 클래스를 설계할 때는 상위 클래스의 동작 규칙을 따라야 한다.\u003cbr\u003e상위 클래스는 함수의 동작 규칙을 정의하고 하위 클래스는 함수의 내부 구현 논리를 변경할 수 있지만 함수의 원래 동작 규칙은 변경할 수 없다.\u003cbr\u003e여기서 말하는 동작 규칙에는 함수가 구현하기 위해 선언한 것, 입력, 출력, 예외에 대한 규칙, 주석에 나열된 모든 특수 사례 설명이 포함된다.\u003cbr\u003e사실 여기에서 언급된 상위 클래스와 하위 클래스 간의 관계는 인터페이스와 구현 클래스 간의 관계로 대체될 수도 있다.\u003cbr\u003e\u003cbr\u003e--- p.137\u003cbr\u003e\u003cbr\u003e팩터리 패턴은 동일한 상위 클래스나 인터페이스를 상속하는 하위 클래스 그룹과 같이 유형은 다르지만 연관되어 있는 객체를 생성할 때 사용되며, 이때 어떤 유형의 객체를 생성할지는 미리 지정된 매개변수에 의해 결정된다.\u003cbr\u003e반면에 빌더 패턴은 동일한 유형의 복잡도가 높은 객체를 생성하는데, 이때 선택적인 매개변수를 설정하거나 사용자 정의를 통해 다른 객체를 생성한다.\u003cbr\u003e\/ 두 패턴의 차이점은 고전적인 예를 통해 쉽게 이해할 수 있다.\u003cbr\u003e고객이 식당에 들어가서 주문을 하면 팩터리 패턴을 사용하여 고객의 선택에 따라 피자, 버거, 샐러드와 같은 다양한 음식을 만들고, 빌더 패턴을 통해 치즈, 토마토, 베이컨 등 고객이 선택한 다양한 토핑을 얹은 피자를 만들 수 있다.\u003cbr\u003e\u003cbr\u003e--- p.301\u003cbr\u003e\u003cbr\u003e메멘토 패턴을 적용할 때, 백업할 객체가 상대적으로 크거나 백업 빈도가 높으면 스냅숏이 차지하는 메모리가 상대적으로 많아지고, 백업과 복구에 드는 시간이 상대적으로 길어진다.\u003cbr\u003e이 문제를 해결하는 방법은 무엇일까? \/ 응용 시나리오마다 각각에 최적화된 다양한 해결 방안이 있기 마련이다.\u003cbr\u003e예를 들어 8.10.1절에서 살펴본 예제는 메멘토 패턴을 이용하여 실행 취소 기능을 구현했는데, 이때 순차적인 실행 취소만 지원한다.\u003cbr\u003e즉, 실행을 취소할 때 마지막에 입력한 텍스트만 취소할 수 있으며, 이를 건너뛰고 이전에 입력한 텍스트를 취소할 필요가 없다.\u003cbr\u003e이 경우에는 메모리를 절약하기 위해 전체 텍스트를 스냅숏에 저장하는 대신 소량의 정보만 따로 기록할 수 있다.\u003cbr\u003e스냅숏을 얻을 때 입력했던 텍스트의 길이를 얻어 오면 원본 텍스트에서 해당 길이만큼 잘라내는 방법을 쓰면 된다.\u003cbr\u003e\n\u003c\/div\u003e \u003cdiv\u003e--- p.489\u003c\/div\u003e \u003c\/div\u003e \u003cdiv\u003e\u003c\/div\u003e \u003c\/div\u003e \u003cbr\u003e\u003cdiv\u003e \u003ch5\u003e\u003cb\u003e출판사 리뷰\u003c\/b\u003e\u003c\/h5\u003e \u003c\/div\u003e \u003cdiv\u003e \u003cdiv\u003e  \u003cb\u003e객체지향 프로그래밍, 설계 원칙, 코딩 규칙, 리팩터링, 디자인 패턴으로 코드 품질을 높이자\u003cbr\u003e\u003c\/b\u003e\u003cbr\u003e개발자는 연차가 쌓일수록 코드의 품질을 올리고 싶은 욕구에 휩싸인다.\u003cbr\u003e하지만 안타깝게도 많은 기업의 개발 부서는 기능 하나하나를 만들어내고 일정을 쳐내는 데 급급한 실정이다.\u003cbr\u003e작성해놓은 코드가 동작만 한다면 다시 들춰볼 시간도, 여유도 없다.\u003cbr\u003e그런데 이렇게 급하게 만든 코드를 유지 보수하다 보면 막막해져서 모든 코드를 삭제하고 다시 작성하고 싶어진다.\u003cbr\u003e\u003cbr\u003e그렇다면 고품질의 코드는 어떻게 작성할까? 엄격한 코드 품질 관리로 유지 보수 비용을 현저히 낮추는 개발 환경(구글)에서 근무했던 저자는 코드 설계에 대한 이론 지식을 먼저 갖추는 것을 추천한다.\u003cbr\u003e코드 설계 이론 지식은 코드의 유지 보수성, 가독성, 확장성, 유연성, 간결성, 재사용성, 테스트 용이성을 높이는 데 도움이 된다.\u003cbr\u003e\u003cbr\u003e\u003cbr\u003e책의 1장에서는 고품질의 코드란 무엇인지 정의하고 과도한 설계를 피하는 법을 알려준다.\u003cbr\u003e2장에서는 설계 원칙과 디자인 패턴의 기초에 해당하는 객체지향 프로그래밍을 소개하고, 3장에서는 SOLID 원칙, KISS 원칙, YAGNI 원칙, DRY 원칙, LoD 원칙 등 중요한 설계 원칙을 소개한다.\u003cbr\u003e\u003cbr\u003e4장에서는 명명, 주석, 코드 스타일, 코딩 팁을 포함한 코딩 규칙을 배울 수 있고, 5장에서는 리팩터링의 네 가지 요소와 단위 테스트, 코드 테스트 용이성, 디커플링 등을 다루고 예제와 함께 리팩터링 기술을 익힌다.\u003cbr\u003e\u003cbr\u003e6장, 7장, 8장은 각각 생성, 구조, 행동 세 가지 분류로 나눠 22가지 디자인 패턴을 소개한다.\u003cbr\u003e6장에서는 싱글턴 패턴, 팩터리 패턴, 빌더 패턴, 프로토타입 패턴을 포함한 생성 디자인 패턴을, 7장에서는 프록시 패턴, 데커레이터 패턴, 어댑터 패턴, 브리지 패턴, 퍼사드 패턴, 복합체 패턴, 플라이웨이트 패턴을 포함한 구조 디자인 패턴을 소개한다.\u003cbr\u003e8장에서는 옵서버 패턴, 템플릿 메서드 패턴, 전략 패턴, 책임 연쇄 패턴, 상태 패턴, 반복자 패턴, 비지터 패턴, 메멘토 패턴, 커맨드 패턴, 인터프리터 패턴, 중재자 패턴 등 행동 디자인 패턴을 소개한다.\u003cbr\u003e\u003cbr\u003e이 책의 코드는 대부분 자바로 작성되었지만, 다루는 내용과 설명은 특정 프로그래밍 언어와 관련이 없으며 어떤 프로그래밍 언어를 사용하더라도 모두 읽을 수 있다.\u003cbr\u003e코딩 능력을 향상하고 싶은 모든 개발자들에게 추천한다.\u003cbr\u003e\n\u003c\/div\u003e \u003cdiv\u003e\u003c\/div\u003e \u003c\/div\u003e \u003c\/div\u003e\n\u003c\/div\u003e\n\u003ccenter\u003e\u003ctable\u003e\u003ctr\u003e\u003ctd style=\"height:10px\"\u003e\u003c\/td\u003e\u003c\/tr\u003e\u003c\/table\u003e\u003c\/center\u003e\n\u003ccenter\u003e\u003ctable\u003e\u003ctr\u003e\u003ctd style=\"height:10px\"\u003e\u003c\/td\u003e\u003c\/tr\u003e\u003c\/table\u003e\u003c\/center\u003e\n\u003cdiv style=\"width:95%;padding-top:20px;padding-bottom:20px\"\u003e\n\u003cdiv style=\"text-align:left;font-size:16px;font-weight:bold;padding-bottom:20px\"\u003eGOODS SPECIFICS\u003c\/div\u003e\n\u003cdiv style=\"text-align:left;font-size:14px;line-height:1.6em;\"\u003e\n\u003cdiv style=\"width:100%;margin-bottom:5px;line-height:1.6em;font-size:14px\"\u003e- \u003cstrong\u003e발행일 : \u003c\/strong\u003e2023년 05월 26일\u003c\/div\u003e\n\u003cdiv style=\"width:100%;margin-bottom:5px;line-height:1.6em;font-size:14px\"\u003e- \u003cstrong\u003e쪽수, 무게, 크기 : \u003c\/strong\u003e528쪽 | 1,014g | 188*245*26mm\u003c\/div\u003e\n\u003cdiv style=\"width:100%;margin-bottom:5px;line-height:1.6em;font-size:14px\"\u003e- \u003cstrong\u003eISBN13 : \u003c\/strong\u003e9791192987101\u003c\/div\u003e\n\u003cdiv style=\"width:100%;margin-bottom:5px;line-height:1.6em;font-size:14px\"\u003e- \u003cstrong\u003eISBN10 : \u003c\/strong\u003e1192987101\u003c\/div\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003ccenter\u003e\n\u003ccenter\u003e\u003ctable\u003e\u003ctr\u003e\u003ctd style=\"height:10px\"\u003e\u003c\/td\u003e\u003c\/tr\u003e\u003c\/table\u003e\u003c\/center\u003e\n\u003ccenter\u003e\u003ctable\u003e\u003ctr\u003e\u003ctd style=\"height:10px\"\u003e\u003c\/td\u003e\u003c\/tr\u003e\u003c\/table\u003e\u003c\/center\u003e\n\u003cspan\u003e\u003c\/span\u003e\n\u003c\/center\u003e\n\u003c\/center\u003e","brand":"LIBRAIRIE COREENNE","offers":[{"title":"Default Title","offer_id":43893812527146,"sku":"110482","price":48.0,"currency_code":"EUR","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0683\/2750\/5962\/files\/81de358b98d6b96b2ae93452b067b608.jpg?v=1765418310","url":"https:\/\/librairie.coreenne.fr\/ko\/products\/110482","provider":"LIBRAIRIE COREENNE","version":"1.0","type":"link"}