본문 바로가기

추천 검색어

실시간 인기 검색어

디자인 패턴의 아름다움

객체지향 패러다임부터 설계 원칙, 코딩 규칙, 리팩터링 기법, 디자인 패턴까지
왕정 저자(글) · 김진호 번역
제이펍 · 2023년 05월 26일
10.0
10점 중 10점
(15개의 리뷰)
도움돼요 (55%의 구매자)
  • 디자인 패턴의 아름다움 대표 이미지
    디자인 패턴의 아름다움 대표 이미지
  • 디자인 패턴의 아름다움 부가 이미지1
    디자인 패턴의 아름다움 부가 이미지1
  • 디자인 패턴의 아름다움 부가 이미지2
    디자인 패턴의 아름다움 부가 이미지2
  • A4
    사이즈 비교
    210x297
    디자인 패턴의 아름다움 사이즈 비교 188x245
    단위 : mm
01 / 04
무료배송 소득공제
10% 31,500 35,000
적립/혜택
1,750P

기본적립

5% 적립 1,750P

추가적립

  • 5만원 이상 구매 시 추가 2,000P
  • 3만원 이상 구매 시, 등급별 2~4% 추가 최대 1,750P
  • 리뷰 작성 시, e교환권 추가 최대 300원
배송안내
무료배송
배송비 안내
국내도서/외국도서
도서 포함 15,000원 이상 구매 시 무료배송
도서+사은품 또는 도서+사은품+교보Only(교보굿즈)

15,000원 미만 시 2,500원 배송비 부과

교보Only(교보배송)
각각 구매하거나 함께 20,000원 이상 구매 시 무료배송

20,000원 미만 시 2,500원 배송비 부과

해외주문 서양도서/해외주문 일본도서(교보배송)
각각 구매하거나 함께 15,000원 이상 구매 시 무료배송

15,000원 미만 시 2,500원 배송비 부과

업체배송 상품(전집, GIFT, 음반/DVD 등)
해당 상품 상세페이지 "배송비" 참고 (업체 별/판매자 별 무료배송 기준 다름)
바로드림 오늘배송
업체에서 별도 배송하여 1Box당 배송비 2,500원 부과

1Box 기준 : 도서 10권

그 외 무료배송 기준
바로드림, eBook 상품을 주문한 경우, 플래티넘/골드/실버회원 무료배송쿠폰 이용하여 주문한 경우, 무료배송 등록 상품을 주문한 경우
당일배송 오늘(2/26,수) 도착
기본배송지 기준
배송일자 기준 안내
로그인 : 회원정보에 등록된 기본배송지
로그아웃 : '서울시 종로구 종로1' 주소 기준
로그인정확한 배송 안내를 받아보세요!

이달의 꽃과 함께 책을 받아보세요!

1권 구매 시 결제 단계에서 적용 가능합니다.

알림 신청하시면 원하시는 정보를
받아 보실 수 있습니다.

북카드

키워드 Pick

키워드 Pick 안내

관심 키워드를 주제로 다른 연관 도서를 다양하게 찾아 볼 수 있는 서비스로, 클릭 시 관심 키워드를 주제로 한 다양한 책으로 이동할 수 있습니다.
키워드는 최근 많이 찾는 순으로 정렬됩니다.

디자인 패턴의 아름다움 상세 이미지
구글러의 코드 품질 관리 비법을 공개한다
코드의 품질을 매우 중요시했던 구글러들은 코드에 달린 주석에서 작은 마침표 오류까지 수정을 요청하기에 이르렀고, 그만큼 엄격했던 코드 품질 관리 덕분에 프로젝트의 유지 관리 비용이 매우 낮아졌다. 이와 같은 경험을 집대성한 이 책에서는 200여 개의 실제 프로젝트 사례를 바탕으로 객체지향 패러다임, 설계 원칙, 코딩 규칙, 리팩터링 기법, 디자인 패턴의 5가지 측면에서 고품질의 코드 작성 방법을 상세히 배울 수 있다.

작가정보

저자(글) 왕정

王争
구글에서 번역 관련 시스템 개발에 참여했고 10여 년간 알고리즘을 연구해왔다. 현재는 금융회사에서 수석 시스템 아키텍트로서 회사의 비즈니스 아키텍처 설계 및 개발을 책임지고 있다. 데이터 구조, 디자인패턴, 알고리즘에 관심이 있으며 기술 공유에 진심이다. 《数据结构与算法之美(데이터 구조와 알고리즘의 아름다움)》를 집필하였다.

번역 김진호

25년 차 소프트웨어 개발자로 싸이월드, 티맵 등의 모바일 솔루션을 개발했으며, 사우디아라비아 등 중동의 여러 국가, 인도네시아, 멕시코의 은행 결제 시스템을 개발해왔다. 이후 K-POP, 블록체인, 정보 관리 등 다양한 분야의 스타트업에서 CTO를 역임하다가 2023년부터 애자일 솔루션 업체의 개발 이사로 근무 중이다. 저서로는 《실전 안드로이드 프로그래밍》(케이엔피 IT, 2011), 《갤럭시 S & 안드로이드폰 완전정복》(이비락, 2010), 《갤럭시 S 안드로이드폰 어플 활용 백서》(글로벌, 2010), 《입문자를 위한 Windows CE Programming》(가남사,2002) 등 다수가 있다.

목차

  • 옮긴이 머리말 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
    __3.2.5 생각해보기 134
    3.3 리스코프 치환 원칙 134
    __3.3.1 리스코프 치환 원칙의 정의 134
    __3.3.2 리스코프 치환 원칙과 다형성의 차이점 136
    __3.3.3 리스코프 치환 원칙을 위반하는 안티 패턴 137
    __3.3.4 생각해보기 139
    3.4 인터페이스 분리 원칙 139
    __3.4.1 API나 기능의 집합으로서의 인터페이스 139
    __3.4.2 단일 API나 기능으로서의 인터페이스 141
    __3.4.3 객체지향 프로그래밍에서의 인터페이스 142
    __3.4.4 생각해보기 149
    3.5 의존 역전 원칙 149
    __3.5.1 제어 반전 150 / 3.5.2 의존성 주입 152 / 3.5.3 의존성 주입 프레임워크 153
    __3.5.4 의존 역전 원칙 154 / 3.5.5 생각해보기 155
    3.6 KISS 원칙과 YAGNI 원칙 155
    __3.6.1 KISS 원칙의 정의와 해석 155
    __3.6.2 적은 줄 수의 코드가 더 간단하지 않다 156
    __3.6.3 복잡한 코드가 반드시 KISS 원칙을 위반하는 것은 아니다 158
    __3.6.4 KISS 원칙을 만족하는 코드 작성 방법 160
    __3.6.5 YAGNI 원칙과 KISS 원칙의 차이 160
    __3.6.6 생각해보기 161
    3.7 DRY 원칙 161
    __3.7.1 코드 논리의 중복 161 / 3.7.2 기능적(의미론적) 중복 164
    __3.7.3 코드 실행의 중복 165 / 3.7.4 코드 재사용성 167
    __3.7.5 생각해보기 169
    3.8 LoD 169
    __3.8.1 높은 응집도와 낮은 결합도에 대한 생각 169
    __3.8.2 LoD의 정의 171
    __3.8.3 정의 해석 및 첫 번째 예제 코드 171
    __3.8.4 정의 해석 및 두 번째 예제 코드 174
    __3.8.5 생각해보기 177

    CHAPTER 4 코딩 규칙 179
    4.1 명명과 주석 179
    __4.1.1 긴 이름과 짧은 이름 179
    __4.1.2 문맥 정보를 사용한 명명 단순화 180
    __4.1.3 비즈니스 용어집을 사용한 명명 통일 180
    __4.1.4 명명은 정확하지만 추상적이어야 한다 181
    __4.1.5 주석에 반드시 포함되어야 하는 것들 181
    __4.1.6 주석이 많다고 좋은 것은 아니다 183
    __4.1.7 생각해보기 183
    4.2 코드 스타일 184
    __4.2.1 클래스, 함수의 적절한 크기 184
    __4.2.2 한 줄의 적절한 길이 185
    __4.2.3 빈 줄을 활용한 코드 블록 구분 185
    __4.2.4 4칸 들여쓰기 혹은 2칸 들여쓰기 185
    __4.2.5 여는 중괄호는 어디에 놓여야 할까 186
    __4.2.6 클래스의 멤버 순서 186
    __4.2.7 생각해보기 187
    4.3 코딩 팁 187
    __4.3.1 복잡한 코드의 모듈화 187 / 4.3.2 함수의 매개변수 관리 188
    __4.3.3 함수의 플래그 매개변수 제거 189 / 4.3.4 깊은 중첩 코드 제거 191
    __4.3.5 설명 변수 194 / 4.3.6 생각해보기 195

    CHAPTER 5 리팩터링 기법 197
    5.1 리팩터링의 네 가지 요소: 목적, 대상, 시기, 방법 197
    __5.1.1 리팩터링의 목적 197 / 5.1.2 리팩터링의 대상 199
    __5.1.3 리팩터링의 시기 199 / 5.1.4 리팩터링의 방법 200
    __5.1.5 생각해보기 201
    5.2 단위 테스트 201
    __5.2.1 단위 테스트에 대해 201
    __5.2.2 단위 테스트 코드를 작성하는 이유 204
    __5.2.3 단위 테스트를 설계하는 방법 206
    __5.2.4 단위 테스트를 작성하기 어려운 이유 209
    __5.2.5 생각해보기 210
    5.3 코드 테스트 용이성 210
    __5.3.1 테스트 가능한 코드를 작성하는 방법 210
    __5.3.2 테스트가 불가능한 코드 220
    __5.3.3 생각해보기 222
    5.4 디커플링 223
    __5.4.1 디커플링이 중요한 이유 223
    __5.4.2 코드를 디커플링해야 하는지 판단하기 223
    __5.4.3 코드 디커플링 방법 224
    __5.4.4 생각해보기 227
    5.5 리팩터링 예제 227
    __5.5.1 ID 생성기의 요구 사항과 개발 배경 228
    __5.5.2 사용 가능한 수준의 코드 구현 228
    __5.5.3 코드 품질 문제를 찾는 방법 230
    __5.5.4 가독성 향상을 위한 리팩터링 232
    __5.5.5 코드 테스트 용이성 향상을 위한 리팩터링 234
    __5.5.6 단위 테스트 코드 작성을 위한 리팩터링 236
    __5.5.7 예외 처리를 위한 리팩터링 239
    __5.5.8 생각해보기 251

    CHAPTER 6 생성 디자인 패턴 253
    6.1 싱글턴 패턴 (1) 253
    __6.1.1 싱글턴 패턴의 정의 253 / 6.1.2 싱글턴 패턴의 구현 254
    __6.1.3 싱글턴 패턴의 적용 259 / 6.1.4 싱글턴 패턴의 단점 263
    __6.1.5 싱글턴 패턴의 대안 266 / 6.1.6 생각해보기 268
    6.2 싱글턴 패턴 (2) 268
    __6.2.1 싱글턴 패턴의 유일성 268
    __6.2.2 스레드 전용 싱글턴 패턴 269
    __6.2.3 클러스터 환경에서의 싱글턴 패턴 270
    __6.2.4 다중 인스턴스 패턴 272
    __6.2.5 생각해보기 273
    6.3 팩터리 패턴 (1) 273
    __6.3.1 단순 팩터리 패턴 274 / 6.3.2 팩터리 메서드 패턴 278
    __6.3.3 추상 팩터리 패턴 281 / 6.3.4 팩터리 패턴의 적용 대상 283
    __6.3.5 생각해보기 283
    6.4 팩터리 패턴 (2) 284
    __6.4.1 DI 컨테이너와 팩터리 패턴의 차이 284
    __6.4.2 DI 컨테이너의 핵심 기능 284
    __6.4.3 DI 컨테이너의 설계와 구현 287
    __6.4.4 생각해보기 292
    6.5 빌더 패턴 293
    __6.5.1 생성자를 사용한 객체 생성 293
    __6.5.2 setter 메서드를 사용한 멤버 변수 설정 295
    __6.5.3 빌더 패턴을 이용한 매개변수 검증 296
    __6.5.4 Guava에서 빌더 패턴 적용 299
    __6.5.5 빌더 패턴과 팩터리 패턴의 차이 301
    __6.5.6 생각해보기 301
    6.6 프로토타입 패턴 302
    __6.6.1 프로토타입 패턴의 정의 302
    __6.6.2 프로토타입 패턴의 적용 302
    __6.6.3 프로토타입 패턴의 구현 306
    __6.6.4 생각해보기 310

    CHAPTER 7 구조 디자인 패턴 313
    7.1 프록시 패턴 313
    __7.1.1 인터페이스 기반의 프록시 패턴 313
    __7.1.2 상속 기반의 프록시 패턴 316
    __7.1.3 리플렉션 기반의 동적 프록시 317
    __7.1.4 프록시 패턴의 활용 방법 318
    __7.1.5 생각해보기 320
    7.2 데커레이터 패턴: Java IO 라이브러리의 기본 설계 사상 분석 320
    __7.2.1 Java IO 라이브러리의 특이한 사용 방법 320
    __7.2.2 상속 기반 설계 322
    __7.2.3 데커레이터 패턴 기반 설계 계획 323
    __7.2.4 생각해보기 328
    7.3 어댑터 패턴 328
    __7.3.1 클래스 어댑터와 객체 어댑터 328
    __7.3.2 어댑터 패턴의 응용 330
    __7.3.3 자바 로깅과 어댑터 패턴 336
    __7.3.4 래퍼 패턴 338
    __7.3.5 생각해보기 342
    7.4 브리지 패턴 343
    __7.4.1 브리지 패턴의 정의 343
    __7.4.2 브리지 패턴으로 폭발적인 상속 해결하기 343
    __7.4.3 생각해보기 344
    7.5 퍼사드 패턴 344
    __7.5.1 퍼사드 패턴과 인터페이스 설계 345
    __7.5.2 퍼사드 패턴의 응용: 인터페이스 사용성 개선하기 346
    __7.5.3 퍼사드 패턴의 응용: 인터페이스 성능 향상하기 346
    __7.5.4 퍼사드 패턴의 응용: 트랜잭션 문제 해결하기 346
    __7.5.5 생각해보기 348
    7.6 복합체 패턴 348
    __7.6.1 복합체 패턴 기반의 디렉터리 트리 348
    __7.6.2 복합체 패턴 기반의 휴먼 트리 353
    __7.6.3 생각해보기 356
    7.7 플라이웨이트 패턴 356
    __7.7.1 체스 게임에서 플라이웨이트 패턴 적용 356
    __7.7.2 텍스트 편집기에서 플라이웨이트 패턴 적용 359
    __7.7.3 Java의 Integer에서 플라이웨이트 패턴 적용 362
    __7.7.4 Java의 String에서 플라이웨이트 패턴 적용 367
    __7.7.5 플라이웨이트 패턴과 싱글턴 패턴, 캐시, 오브젝트 풀의 차이 368
    __7.7.6 생각해보기 369

    CHAPTER 8 행동 디자인 패턴 371
    8.1 옵서버 패턴 371
    __8.1.1 옵서버 패턴의 정의 371
    __8.1.2 옵서버 패턴의 코드 구현 372
    __8.1.3 옵서버 패턴의 의미 373
    __8.1.4 옵서버 패턴의 적용 376
    __8.1.5 비동기식 비차단 옵서버 패턴 377
    __8.1.6 EventBus 프레임워크 379
    __8.1.7 EventBus 프레임워크를 처음부터 구현하기 382
    __8.1.8 생각해보기 388
    8.2 템플릿 메서드 패턴 (1) 388
    __8.2.1 템플릿 메서드 패턴의 정의와 구현 388
    __8.2.2 템플릿 메서드 패턴의 역할: 재사용 390
    __8.2.3 템플릿 메서드 패턴의 역할: 확장 392
    __8.2.4 생각해보기 395
    8.3 템플릿 메서드 패턴 (2) 396
    __8.3.1 콜백의 원리와 구현 396
    __8.3.2 JdbcTemplate 클래스 398
    __8.3.3 setClickListener() 메서드 401
    __8.3.4 addShutdownHook() 메서드 402
    __8.3.5 템플릿 메서드 패턴과 콜백의 차이점 404
    __8.3.6 생각해보기 405
    8.4 전략 패턴 405
    __8.4.1 전략 패턴의 정의와 구현 405
    __8.4.2 전략 패턴으로 분기 결정 대체 408
    __8.4.3 전략 패턴을 통한 파일 내용 정렬 410
    __8.4.4 전략 패턴의 오용 417
    __8.4.5 생각해보기 417
    8.5 책임 연쇄 패턴 417
    __8.5.1 책임 연쇄 패턴의 정의와 구현 417
    __8.5.2 책임 연쇄 패턴 기반의 민감 단어 필터링 423
    __8.5.3 책임 연쇄 패턴 기반의 서블릿 필터 426
    __8.5.4 책임 연쇄 패턴과 Spring의 인터셉터 430
    __8.5.5 책임 연쇄 패턴과 MyBatis 플러그인 432
    __8.5.6 생각해보기 439
    8.6 상태 패턴 439
    __8.6.1 유한 상태 기계란 무엇인가 439
    __8.6.2 분기 판단 방법으로 상태 머신 구현하기 442
    __8.6.3 테이블 조회 방법으로 상태 머신 구현하기 443
    __8.6.4 상태 패턴으로 상태 머신 구현하기 446
    __8.6.5 생각해보기 451
    8.7 반복자 패턴 (1) 451
    __8.7.1 반복자 패턴의 정의와 구현 451
    __8.7.2 컬렉션 순회 방법 454
    __8.7.3 반복자의 문제 456
    __8.7.4 반복자의 문제 해결 458
    __8.7.5 생각해보기 463
    8.8 반복자 패턴 (2) 464
    __8.8.1 스냅숏 기능을 지원하는 반복자 464
    __8.8.2 여러 복사본 기반의 설계 사상 466
    __8.8.3 시간값 기반의 설계 사상 466
    __8.8.4 생각해보기 470
    8.9 비지터 패턴 470
    __8.9.1 비지터 패턴의 도출 과정 470
    __8.9.2 이중 디스패치 481
    __8.9.3 생각해보기 484
    8.10 메멘토 패턴 485
    __8.10.1 메멘토 패턴의 정의 및 구현 485
    __8.10.2 시간과 공간 최적화 489
    __8.10.3 생각해보기 490
    8.11 커맨드 패턴 490
    __8.11.1 커맨드 패턴의 정의 490
    __8.11.2 모바일 게임 서버에 커맨드 패턴 적용 491
    __8.11.3 커맨드 패턴과 전략 패턴의 차이 494
    __8.11.4 생각해보기 494
    8.12 인터프리터 패턴 494
    __8.12.1 인터프리터 패턴의 정의 494
    __8.12.2 인터프리터 패턴으로 표현식 계산하기 495
    __8.12.3 인터프리터 패턴으로 규칙 엔진 개발하기 499
    __8.12.4 생각해보기 502
    8.13 중재자 패턴 502
    __8.13.1 중재자 패턴의 정의와 구현 503
    __8.13.2 중재자 패턴과 옵서버 패턴의 차이점 504
    __8.13.3 생각해보기 505

    찾아보기 506

책 속으로

우리는 종종 코드 품질에 주의를 기울여야 하고 코드를 작성하기 전에 코드 설계 단계를 무시하지 않아야 한다고 말한다. 코드를 설계하지 않는 것은 좋지 않지만, 과도하게 설계하는 것도 좋지 않다. 과거 업무 경험 동안 많은 동료를 겪었는데, 특히 코드를 과도하게 설계하고 디자인 패턴을 남용하는 것을 좋아하지만 개발 경험이 적은 엔지니어들이 있었다. 그들은 코딩을 시작하기도 전에 코드 설계 작업에 오랜 시간을 할애한다. 간단한 요구 사항이나 단순한 코드의 경우 코드가 더 유연하고 향후 확장을 위한 견고한 기반이 되기를 바라며 개발 프로세스에서 다양한 디자인 패턴을 적용하는 경우가 많다. 하지만 과도한 설계는 나중에 요구 사항이 변하지 않을 수도 있기 때문에, 이런 시도는 코드의 복잡성만 높일 뿐이다. 따라서 우리는 과도한 설계를 피하는 방법, 특히 객체지향 프로그래밍 패러다임, 설계 원칙, 코딩 규칙, 리팩터링과 같이 디자인 패턴의 남용을 피하는 방법에 대해 이야기할 필요가 있다. (18쪽)

그러나 일반적으로 대부분의 프로그래머는 종종 객체지향 분석과 객체지향 설계를 머릿속이나 간단한 스케치로 마친 후 바로 코드 작성을 시작할 뿐만 아니라, 코드 작성 도중에도 최적화와 리팩터링을 하는 경우가 많다. 반대로 코드를 작성하기 전에 객체지향 분석과 설계에 많은 시간을 할애하고 단단한 클래스 다이어그램과 UML 다이어그램을 그렸더라도, 모든 세부 사항과 상호 작용에 대해 한 번에 다 정의하는 것은 불가능하다. 코드를 작성하면서 여전히 코드를 뒤엎어 리팩터링하고, 또 이를 반복해야 한다. 결국 소프트웨어 개발은 본질적으로 지속적인 반복, 패치, 문제 발견, 문제 해결의 과정이며, 지속적인 리팩터링의 과정이다. 엄격하게 하나의 단계를 모두 마치고 다음 단계로 넘어가는 것이 불가능하다는 것을 알아야 한다. (55쪽)

리스코프 원칙에는 좀 더 이해하기 쉬운 설명 방식이 있는데, 바로 계약에 따른 설계(design by contract)라는 표현이다. 하위 클래스를 설계할 때는 상위 클래스의 동작 규칙을 따라야 한다. 상위 클래스는 함수의 동작 규칙을 정의하고 하위 클래스는 함수의 내부 구현 논리를 변경할 수 있지만 함수의 원래 동작 규칙은 변경할 수 없다. 여기서 말하는 동작 규칙에는 함수가 구현하기 위해 선언한 것, 입력, 출력, 예외에 대한 규칙, 주석에 나열된 모든 특수 사례 설명이 포함된다. 사실 여기에서 언급된 상위 클래스와 하위 클래스 간의 관계는 인터페이스와 구현 클래스 간의 관계로 대체될 수도 있다. (137쪽)

팩터리 패턴은 동일한 상위 클래스나 인터페이스를 상속하는 하위 클래스 그룹과 같이 유형은 다르지만 연관되어 있는 객체를 생성할 때 사용되며, 이때 어떤 유형의 객체를 생성할지는 미리 지정된 매개변수에 의해 결정된다. 반면에 빌더 패턴은 동일한 유형의 복잡도가 높은 객체를 생성하는데, 이때 선택적인 매개변수를 설정하거나 사용자 정의를 통해 다른 객체를 생성한다. / 두 패턴의 차이점은 고전적인 예를 통해 쉽게 이해할 수 있다. 고객이 식당에 들어가서 주문을 하면 팩터리 패턴을 사용하여 고객의 선택에 따라 피자, 버거, 샐러드와 같은 다양한 음식을 만들고, 빌더 패턴을 통해 치즈, 토마토, 베이컨 등 고객이 선택한 다양한 토핑을 얹은 피자를 만들 수 있다. (301쪽)

메멘토 패턴을 적용할 때, 백업할 객체가 상대적으로 크거나 백업 빈도가 높으면 스냅숏이 차지하는 메모리가 상대적으로 많아지고, 백업과 복구에 드는 시간이 상대적으로 길어진다. 이 문제를
해결하는 방법은 무엇일까? / 응용 시나리오마다 각각에 최적화된 다양한 해결 방안이 있기 마련이다. 예를 들어 8.10.1절에서 살펴본 예제는 메멘토 패턴을 이용하여 실행 취소 기능을 구현했는데, 이때 순차적인 실행 취소만 지원한다. 즉, 실행을 취소할 때 마지막에 입력한 텍스트만 취소할 수 있으며, 이를 건너뛰고 이전에 입력한 텍스트를 취소할 필요가 없다. 이 경우에는 메모리를 절약하기 위해 전체 텍스트를 스냅숏에 저장하는 대신 소량의 정보만 따로 기록할 수 있다. 스냅숏을 얻을 때 입력했던 텍스트의 길이를 얻어 오면 원본 텍스트에서 해당 길이만큼 잘라내는 방법을 쓰면 된다. (489쪽)

출판사 서평

객체지향 프로그래밍, 설계 원칙, 코딩 규칙, 리팩터링, 디자인 패턴으로 코드 품질을 높이자

개발자는 연차가 쌓일수록 코드의 품질을 올리고 싶은 욕구에 휩싸인다. 하지만 안타깝게도 많은 기업의 개발 부서는 기능 하나하나를 만들어내고 일정을 쳐내는 데 급급한 실정이다. 작성해놓은 코드가 동작만 한다면 다시 들춰볼 시간도, 여유도 없다. 그런데 이렇게 급하게 만든 코드를 유지 보수하다 보면 막막해져서 모든 코드를 삭제하고 다시 작성하고 싶어진다.
그렇다면 고품질의 코드는 어떻게 작성할까? 엄격한 코드 품질 관리로 유지 보수 비용을 현저히 낮추는 개발 환경(구글)에서 근무했던 저자는 코드 설계에 대한 이론 지식을 먼저 갖추는 것을 추천한다. 코드 설계 이론 지식은 코드의 유지 보수성, 가독성, 확장성, 유연성, 간결성, 재사용성, 테스트 용이성을 높이는 데 도움이 된다.
책의 1장에서는 고품질의 코드란 무엇인지 정의하고 과도한 설계를 피하는 법을 알려준다. 2장에서는 설계 원칙과 디자인 패턴의 기초에 해당하는 객체지향 프로그래밍을 소개하고, 3장에서는 SOLID 원칙, KISS 원칙, YAGNI 원칙, DRY 원칙, LoD 원칙 등 중요한 설계 원칙을 소개한다.
4장에서는 명명, 주석, 코드 스타일, 코딩 팁을 포함한 코딩 규칙을 배울 수 있고, 5장에서는 리팩터링의 네 가지 요소와 단위 테스트, 코드 테스트 용이성, 디커플링 등을 다루고 예제와 함께 리팩터링 기술을 익힌다.
6장, 7장, 8장은 각각 생성, 구조, 행동 세 가지 분류로 나눠 22가지 디자인 패턴을 소개한다. 6장에서는 싱글턴 패턴, 팩터리 패턴, 빌더 패턴, 프로토타입 패턴을 포함한 생성 디자인 패턴을, 7장에서는 프록시 패턴, 데커레이터 패턴, 어댑터 패턴, 브리지 패턴, 퍼사드 패턴, 복합체 패턴, 플라이웨이트 패턴을 포함한 구조 디자인 패턴을 소개한다. 8장에서는 옵서버 패턴, 템플릿 메서드 패턴, 전략 패턴, 책임 연쇄 패턴, 상태 패턴, 반복자 패턴, 비지터 패턴, 메멘토 패턴, 커맨드 패턴, 인터프리터 패턴, 중재자 패턴 등 행동 디자인 패턴을 소개한다.
이 책의 코드는 대부분 자바로 작성되었지만, 다루는 내용과 설명은 특정 프로그래밍 언어와 관련이 없으며 어떤 프로그래밍 언어를 사용하더라도 모두 읽을 수 있다. 코딩 능력을 향상하고 싶은 모든 개발자들에게 추천한다.

기본정보

상품정보 테이블로 ISBN, 발행(출시)일자 , 쪽수, 크기, 총권수을(를) 나타낸 표입니다.
ISBN 9791192987101
발행(출시)일자 2023년 05월 26일
쪽수 528쪽
크기
188 * 245 * 29 mm / 1088 g
총권수 1권

Klover 리뷰 (15)

구매 후 리뷰 작성 시, e교환권 200원 적립

10점 중 10점
/최고예요
도움이 되는 내용이 많습니다
10점 중 10점
/도움돼요
디자인패턴에 대한 샘플소스가 있어서 이해하기 쉬웠습니다
10점 중 10점
/최고예요
디자인 패턴은 꼭! 공부해야해요
10점 중 10점
/집중돼요
개발자에게 도움이 됩니다
10점 중 10점
/도움돼요
개발자에게 추천합니다.
10점 중 10점
/도움돼요
전자책 출간 계획 없다고 출판사에 답 듣고 샀는데 전자책 나왔네요 ㅜㅜ 잘 읽을게요
10점 중 10점
/쉬웠어요
설명이 쉽게 되어있어서 좋았네요
10점 중 10점
/도움돼요
무의식 적으로 행하는 패턴들의 정의와 장단점을 확립햐주는 책

문장수집 (2)

문장수집 안내
문장수집은 고객님들이 직접 선정한 책의 좋은 문장을 보여주는 교보문고의 새로운 서비스입니다. 마음을 두드린 문장들을 기록하고 좋은 글귀들은 "좋아요“ 하여 모아보세요. 도서 문장과 무관한 내용 등록 시 별도 통보 없이 삭제될 수 있습니다.
리워드 안내
구매 후 90일 이내에 문장수집 작성 시 e교환권 100원을 적립해드립니다.
e교환권은 적립 일로부터 180일 동안 사용 가능합니다. 리워드는 작성 후 다음 날 제공되며, 발송 전 작성 시 발송 완료 후 익일 제공됩니다.
리워드는 한 상품에 최초 1회만 제공됩니다.
주문취소/반품/절판/품절 시 리워드 대상에서 제외됩니다.
판매가 5,000원 미만 상품의 경우 리워드 지급 대상에서 제외됩니다. (2024년 9월 30일부터 적용)

구매 후 리뷰 작성 시, e교환권 100원 적립

디자인 패턴은 효율적이면서도 확장가능하고 유지관리 가능한 시스템을 만들어야 하는 소프트웨어 개발자 모두에게 필수적인 도구라고 할 수 있다
디자인 패턴의 아름다움
고품질 코드를 작성하는 방법
디자인 패턴의 아름다움

교환/반품/품절 안내

  • 반품/교환방법

    마이룸 > 주문관리 > 주문/배송내역 > 주문조회 > 반품/교환 신청, [1:1 상담 > 반품/교환/환불] 또는 고객센터 (1544-1900)
    * 오픈마켓, 해외배송 주문, 기프트 주문시 [1:1 상담>반품/교환/환불] 또는 고객센터 (1544-1900)
  • 반품/교환가능 기간

    변심반품의 경우 수령 후 7일 이내,
    상품의 결함 및 계약내용과 다를 경우 문제점 발견 후 30일 이내
  • 반품/교환비용

    변심 혹은 구매착오로 인한 반품/교환은 반송료 고객 부담
  • 반품/교환 불가 사유

    1) 소비자의 책임 있는 사유로 상품 등이 손실 또는 훼손된 경우
    (단지 확인을 위한 포장 훼손은 제외)
    2) 소비자의 사용, 포장 개봉에 의해 상품 등의 가치가 현저히 감소한 경우
    예) 화장품, 식품, 가전제품(악세서리 포함) 등
    3) 복제가 가능한 상품 등의 포장을 훼손한 경우
    예) 음반/DVD/비디오, 소프트웨어, 만화책, 잡지, 영상 화보집
    4) 소비자의 요청에 따라 개별적으로 주문 제작되는 상품의 경우 ((1)해외주문도서)
    5) 디지털 컨텐츠인 ebook, 오디오북 등을 1회이상 ‘다운로드’를 받았거나 '바로보기'로 열람한 경우
    6) 시간의 경과에 의해 재판매가 곤란한 정도로 가치가 현저히 감소한 경우
    7) 전자상거래 등에서의 소비자보호에 관한 법률이 정하는 소비자 청약철회 제한 내용에 해당되는 경우
    8) 세트상품 일부만 반품 불가 (필요시 세트상품 반품 후 낱권 재구매)
    9) 기타 반품 불가 품목 - 잡지, 테이프, 대학입시자료, 사진집, 방통대 교재, 교과서, 만화, 미디어전품목, 악보집, 정부간행물, 지도, 각종 수험서, 적성검사자료, 성경, 사전, 법령집, 지류, 필기구류, 시즌상품, 개봉한 상품 등
  • 상품 품절

    공급사(출판사) 재고 사정에 의해 품절/지연될 수 있으며, 품절 시 관련 사항에 대해서는 이메일과 문자로 안내드리겠습니다.
  • 소비자 피해보상 환불 지연에 따른 배상

    1) 상품의 불량에 의한 교환, A/S, 환불, 품질보증 및 피해보상 등에 관한 사항은 소비자분쟁 해결 기준 (공정거래위원회 고시)에 준하여 처리됨
    2) 대금 환불 및 환불지연에 따른 배상금 지급 조건, 절차 등은 전자상거래 등에서의 소비자 보호에 관한 법률에 따라 처리함

상품 설명에 반품/교환 관련한 안내가 있는 경우 그 내용을 우선으로 합니다. (업체 사정에 따라 달라질 수 있습니다.)

비상 초등 수학 이벤트
이벤트
  • sam x 한샘 [똑똑한sam]
  • 2025 1학기 대학교재전
01 / 02
TOP