상세정보
아름다운 C++
- 저자
- 가이 데이비드슨,케이트 그레고리 공저/박지윤 역
- 출판사
- 제이펍
- 출판일
- 2024-09-11
- 등록일
- 2025-06-16
- 파일포맷
- PDF
- 파일크기
- 6MB
- 공급사
- YES24
- 지원기기
-
PC
PHONE
TABLET
웹뷰어
프로그램 수동설치
뷰어프로그램 설치 안내
책소개
선별된 30개 핵심 가이드라인에서 피어나는 모던 C++의 아름다움 C++ 코딩 스타일을 개선하는 데 유용한 30가지 핵심 가이드라인을 선정해 상세한 실무 지식과 함께 설명한다. 공식 C++ 핵심 가이드라인 웹사이트와 긴밀하게 연계되도록 구성했고, 개념적 통찰력과 전문적인 샘플 코드를 제공한다. 사례와 함께 맥락 속에서 새로운 언어 기능과 오래된 언어 기능 모두를 성공적으로 사용하는 검증된 방법을 조명함으로써, 기본적으로 더 강력하고 성능이 뛰어난 프로그램을 작성하는 방법을 보여준다.
저자소개
크리에이티브 어셈블리의 엔지니어링 실무장으로, 〈토탈 워〉 프랜차이즈 개발, 카탈로그 큐레이션, 엔지니어링 팀의 프로그래밍 표준 개선 작업을 담당하고 있다. ISO C++ 위원회에서 활동하고, #include 〈C++〉 디스코드 서버를 운영하며, C++ 행사에서 연설한다. Prospela, BAME in Games 등 C++ 멘토링 활동도 하고 있다.
목차
옮긴이 머리말 xii베타리더 후기 xiii선정 가이드라인 목록 xvi추천 서문(비야네 스트롭스트룹) xvii시작하며 xix감사의 글 xxivPART 1 사소한 것 때문에 중요한 문제를 놓치지 말자CHAPTER 1.1 [P.2] ISO 표준 C++로 작성하라 3__1.1.1 ISO 표준 C++란 무엇인가? 3__1.1.2 차이를 캡슐화하기 5__1.1.3 예전 방식 학습하기 9__1.1.4 표준 개발 현황 파악하기 11CHAPTER 1.2 [F.51] 선택의 여지가 있다면 오버로딩 대신 기본 인수를 사용하라 13__1.2.1 소개 13__1.2.2 추상화 다듬기: 추가 인수냐, 오버로딩이냐 14__1.2.3 오버로드 확인의 미묘한 차이 16__1.2.4 예제로 돌아가기 18__1.2.5 모호하지 않다는 기본 인수의 특성 19__1.2.6 오버로드의 대안 21__1.2.7 반드시 오버로드해야 하는 경우 21__1.2.8 요약 22CHAPTER 1.3 [C.45] 데이터 멤버를 초기화하기만 하는 기본 생성자를 정의하지 말고 기본 멤버 초기화자로 초깃값을 설정하라 24__1.3.1 어쨌거나 기본 생성자가 있는 이유는? 24__1.3.2 데이터 멤버를 초기화하려면? 26__1.3.3 두 사람이 클래스 하나를 유지보수하면 무슨 일이 발생하나요? 28__1.3.4 요약 31CHAPTER 1.4 [C.131] 자명한 getter와 setter는 피하라 32__1.4.1 아주 오래된 이디엄 32__1.4.2 추상화 33__1.4.3 단순한 캡슐화 36__1.4.4 클래스 불변 조건 39__1.4.5 명사와 동사 41__1.4.6 요약 42CHAPTER 1.5 [ES.10] 선언당 단 하나의 이름만 선언하라 43__1.5.1 소개합니다 43__1.5.2 하위 호환성 47__1.5.3 더 명확하게 선언하기 48__1.5.4 구조적 바인딩 49__1.5.5 요약 51CHAPTER 1.6 [NR.2] 함수에 단일 반환문을 고집하지 말라 52__1.6.1 규칙은 진화합니다 52__1.6.2 정리를 보장하기 54__1.6.3 RAII 사용하기 57__1.6.4 좋은 함수 작성하기 59__1.6.5 요약 61PART 2 자기 발등을 찍지 말라CHAPTER 2.1 [P.11] 지저분한 구조체는 코드에 펼쳐놓지 말고 캡슐화하라 65__2.1.1 한 번에 처리하기 65__2.1.2 지저분한 구조체를 캡슐화한다는 의미 67__2.1.3 언어의 목적과 추상화의 본질 69__2.1.4 추상화 수준 72__2.1.5 리팩터링과 구분 짓기를 통한 추상화 74__2.1.6 요약 75CHAPTER 2.2 [I.23] 함수의 인수를 적게 유지하라 76__2.2.1 얼마나 벌어야 할까요? 76__2.2.2 추상화를 통해 문제를 단순화하기 78__2.2.3 가능한 한 적게 하되, 덜 하지는 말기 81__2.2.4 실제 사례 83__2.2.5 요약 85CHAPTER 2.3 [I.26] 크로스 컴파일러 ABI가 필요하면 C 방식의 하위 집합을 사용하라 86__2.3.1 라이브러리 만들기 86__2.3.2 ABI란 무엇인가? 87__2.3.3 최소한으로 줄이기 89__2.3.4 예외 전파 91__2.3.5 요약 92CHAPTER 2.4 [C.47] 멤버를 선언한 순서대로 데이터 멤버를 정의하고 초기화하라 94__2.4.1 요약 103CHAPTER 2.5 [CP.3] 쓰기 가능한 데이터의 명시적 공유는 최소화하라 104__2.5.1 전통적 실행 모델 104__2.5.2 잠깐, 더 있습니다 106__2.5.3 교착 상태 및 데이터 경쟁 피하기 109__2.5.4 잠금과 뮤텍스 외의 사항 111__2.5.5 요약 114CHAPTER 2.6 [T.120] 꼭 필요할 때만 템플릿 메타프로그래밍을 사용하라 115__2.6.1 std::enable_if에서 requires로 123__2.6.2 요약 128PART 3 그만 사용하라CHAPTER 3.1 [I.11] 절대로 원시 포인터(T*)나 참조(T&)로 소유권을 넘기지 말라 131__3.1.1 자유 공간 사용하기 131__3.1.2 스마트 포인터의 성능 비용 134__3.1.3 데코레이터 없는 참조 시맨틱 사용하기 135__3.1.4 gsl::owner 136__3.1.5 요약 139CHAPTER 3.2 [I.3] 싱글턴을 피하라 140__3.2.1 전역 객체는 나쁩니다 140__3.2.2 싱글턴 디자인 패턴 141__3.2.3 정적 초기화 순서 실패 142__3.2.4 싱글턴 숨기는 법 144__3.2.5 하지만 이 중 하나만 존재해야 합니다 145__3.2.6 잠깐만요... 147__3.2.7 요약 149CHAPTER 3.3 [C.90] memset과 memcpy에 의존하지 말고 생성자와 할당 연산자를 사용하라 150__3.3.1 최대 성능 추구하기 150__3.3.2 끔찍한 생성자 오버헤드 151__3.3.3 가장 간단한 클래스 152__3.3.4 어쨌든 표준에서 설명하는 내용은 무엇인가요? 155__3.3.5 그러면 memcpy는 어때요? 158__3.3.6 컴파일러를 절대 과소평가하지 말라 159__3.3.7 요약 161CHAPTER 3.4 [ES.50] const를 형 변환하지 말라 162__3.4.1 이야기 162__3.4.2 훨씬 더 많은 데이터 다루기 163__3.4.3 상수 방화벽 165__3.4.4 이중 인터페이스 구현 166__3.4.5 캐싱과 느긋한 계산법 168__3.4.6 두 종류의 const 169__3.4.7 const의 놀라운 점 171__3.4.8 요약 172CHAPTER 3.5 [E.28] 전역 상태에 따른 에러 처리는 피하라(예: errno) 173__3.5.1 에러 처리는 어렵습니다 173__3.5.2 C와 errno 173__3.5.3 반환 코드 175__3.5.4 예외 176__3.5.5 〈system_error〉 177__3.5.6 Boost.Outcome 177__3.5.7 에러 처리는 왜 이렇게 어려운가? 179__3.5.8 고생 끝에 낙이 온다 180__3.5.9 요약 182CHAPTER 3.6 [SF.7] 헤더 파일의 전역 범위에 using namespace를 사용하지 말라 183__3.6.1 이렇게 하지 말라 183__3.6.2 명확하게 하기 184__3.6.3 using 사용법 185__3.6.4 심벌은 어디로 가나? 187__3.6.5 한층 더 은밀히 퍼지는 문제 190__3.6.6 복잡한 범위 지정 연산자 문제 해결하기 191__3.6.7 유혹과 타락 193__3.6.8 요약 194PART 4 새로운 기능을 제대로 사용하라CHAPTER 4.1 [F.21] ‘출력값’을 여러 개로 반환하려면 구조체로 반환하라 197__4.1.1 함수 시그니처의 형태 197__4.1.2 설명과 애너테이션 198__4.1.3 이제 객체를 반환할 수 있습니다 199__4.1.4 튜플도 반환할 수 있습니다 203__4.1.5 비상수 참조로 전달 및 반환하기 205__4.1.6 요약 209CHAPTER 4.2 [Enum.3] 단순 열거형보다는 클래스 열거형을 택하라 210__4.2.1 상수 210__4.2.2 범위가 있는 열거형 213__4.2.3 숨겨진 타입 215__4.2.4 암묵적 형 변환 217__4.2.5 요약 219__4.2.6 추신 219CHAPTER 4.3 [ES.5] 범위는 작게 유지하라 220__4.3.1 범위의 본질 220__4.3.2 블록 범위 222__4.3.3 네임스페이스 범위 223__4.3.4 클래스 범위 226__4.3.5 함수 매개변수 범위 228__4.3.6 열거형 범위 229__4.3.7 템플릿 매개변수 범위 230__4.3.8 맥락으로서의 범위 231__4.3.9 요약 232CHAPTER 4.4 [Con.5] 컴파일 타임에 계산할 수 있는 값은 constexpr를 사용하라 233__4.4.1 const부터 constexpr에 이르기까지 233__4.4.2 C++ 기본값 235__4.4.3 constexpr 사용하기 237__4.4.4 inline 241__4.4.5 consteval 242__4.4.6 constinit 243__4.4.7 요약 245CHAPTER 4.5 [T.1] 템플릿을 사용하여 코드의 추상화 수준을 높이라 246__4.5.1 이야기 246__4.5.2 추상화 수준 높이기 248__4.5.3 함수 템플릿과 추상화 250__4.5.4 클래스 템플릿과 추상화 253__4.5.5 작명은 어렵습니다 255__4.5.6 요약 256CHAPTER 4.6 [T.10] 모든 템플릿 인수의 콘셉트를 명시하라 257__4.6.1 어떻게 여기까지 왔을까요? 257__4.6.2 매개변수 제한하기 260__4.6.3 콘셉트를 추상화하는 법 263__4.6.3 콘셉트를 통해 분해하기 266__4.6.5 요약 268PART 5 기본적으로 코드를 잘 작성하라CHAPTER 5.1 [P.4] 프로그램은 최대한 정적으로 타입에 안전해야 한다 273__5.1.1 타입 안전성은 C++의 보안 기능입니다 273__5.1.2 공용체 275__5.1.3 형 변환 277__5.1.4 unsigned 280__5.1.5 버퍼와 크기 283__5.1.6 요약 285CHAPTER 5.2 [P.10] 가변 데이터보다는 불변 데이터를 택하라 286__5.2.1 잘못된 기본값 286__5.2.2 함수 선언의 상수성 289__5.2.3 요약 293CHAPTER 5.3 [I.30] 규칙 위반을 캡슐화하라 294__5.3.1 일상에서 보기 싫은 것 숨기기 294__5.3.2 체면 차리기 296__5.3.3 요약 301CHAPTER 5.4 [ES.22] 값으로 초기화하기 전까지는 변수를 선언하지 말라 303__5.4.1 표현식과 문의 중요성 303__5.4.2 C 언어 방식의 선언 304__5.4.3 선언 후 초기화하기 305__5.4.4 최대한 지연된 선언 307__5.4.5 맥락에 따른 기능의 지역화 309__5.4.6 상태 제거하기 311__5.4.7 요약 313CHAPTER 5.5 [Per.7] 최적화할 수 있도록 설계하라 314__5.5.1 프레임 레이트 최대화하기 314__5.5.2 하드웨어 수준에서 더 나아가 작업하기 316__5.5.3 추상화를 통한 최적화 320__5.5.4 요약 322CHAPTER 5.6 [E.6] 메모리 누수를 방지하려면 RAII를 사용하라 324__5.6.1 결정론적 소멸 324__5.6.2 파일 누수 없애기 327__5.6.3 왜 굳이 이렇게 할까요? 330__5.6.4 미래의 가능성까지 고려해야 하는가 332__5.6.5 어디에서 얻을 수 있나요? 335마치며 338후기(허브 서터) 340찾아보기 342