Effective Modern C++

 

Effective Modern C++_앞표지

>> 책소개
C++11과 C++14에 숙달하려면 새로 추가된 기능들(이를테면 auto 형식 선언, 이동 의미론, 람다 표현식, 동시성 지원 등)에 익숙해지는 것으로는 부족하다. 사실 어려운 것은 그런 기능들을 효과적으로 사용하는 방법, 다시 말해서 그런 기능들을 정확하고, 효율적이고, 유지보수하기 좋고, 이식성을 갖춘 소프트웨어를 만드는 데 활용하는 방법을 배우는 것이다. 이 책은 C++11과 C++14를 이용해서, 즉 현대적인 C++을 이용해서 진정으로 훌륭한 소프트웨어를 작성하는 방법을 설명한다. Effective Modern C++은 스콧 마이어스의 이전 책들에서 검증된 지침 기반, 예제 주도적 형식을 따르되, 완전히 새로운 내용을 다룬다. 이 책은 모든 현대적 C++ 소프트웨어 개발자가 반드시 읽어야 할 책이다.

• 중괄호 초기치, noexcept 명세, 완벽 전달, 똑똑한 포인터 생성 함수의 장단점
• std::move와 std::forward, 오른값 참조, 보편 참조 사이의 관계
• 명확하고 정확하며 효과적인 람다 표현식을 작성하는 기법들
• std::atomic과 volatile의 차이와 각각의 사용법 및 C++ 동시성 API와의 관계
• ‘구식’ C++(즉 C++98) 프로그래밍에서의 모범 관행 중 현대적인 C++ 소프트웨어 개발에 맞게 고쳐야 할 것들

>> 저자 소개
C++에 관한 세계 최고 전문가 중 한 명이다. 인기 있는 강사이자 자문가, 콘퍼런스 강연자인 그의 Effective C++ 시리즈(Effective C++, More Effective C++, Effective STL)는 20년 이상 C++ 프로그래밍 지침의 기준을 확립했다. 그는 Brown University에서 컴퓨터 과학 Ph.D. 학위를 받았다. 그의 웹사이트는 aristeia.com이다.

>> 역자 소개
옮긴이 류광은 1996년부터 활동해 온 프로그래밍 서적 전문 번역가로, Game Programming Gems 시리즈와 컴퓨터 프로그래밍의 예술(The Art of Computer Programming) 제1~4A권, UNIX 고급 프로그래밍(Advanced Programming in UNIX Environment) 제2판과 제3판을 포함하여 60여 권의 다양한 프로그래밍 서적을 번역했다. C++ 관련 번역서로는 일반적 프로그래밍과 STL, C++ Template Metaprogramming, (C++로 배우는) 프로그래밍의 원리와 실제 등이 있다.
번역과 프로그래밍 외에 소프트웨어 문서화에도 많은 관심이 있으며, 수많은 오픈소스 프로젝트들의 표준 문서 형식으로 쓰이는 DocBook의 국내 사용자 모임인 닥북 한국(http://docbook.kr)의 일원이다.
현재 번역서 정보 사이트 occam’s Razor(http://occamsrazr.net)와 게임 개발 및 개발서 관련 사이트 GpgStudy(http://www.gpgstudy.com)를 운영하고 있다.

>> 추천의 글
이 책을 찾는 독자라면 당연히 C++에 여전히 관심이 있을 것이다. 현대적인 C++(즉, C++11과 C++14)은 그냥 기존 C++의 겉모양만 조금 바꾼 것이 아니다. 새로운 기능들을 생각하면 C++의 재발명에 더 가깝다고 할 수 있다. 현대적 C++에 관한 지침과 조언이 필요하다면, 바로 이 책이 여러분이 찾던 책이다. C++에 관해 스콧 마이어스는 예나 지금이나 정확성, 품질, 즐거움과 동의어이다.
―게르하르트 크로이처(Gerhard Kreuzer), Siemens AG의 연구 개발 공학자

최상의 전문 지식을 구하기란 어려운 일이다. 가르침에서의 완벽주의(설명을 주의 깊게 계획하고 매끄럽게 만들려는 저자의 집착)를 추구하는 것 역시 어렵다. 그 둘을 모두 갖춘 사람을 만나는 것은 커다란 즐거움이다. Effective Modern C++은 원숙한 기술 저술가가 만들어낸 크나큰 성취이다. 이 책은 복잡하고 상호연결된 주제들 위에 알기 쉽고 의미 깊은, 그리고 적절한 순서로 나열된 설명들을 겹쳐놓는다. 그 모든 설명은 명료한 구어체로 되어 있다. 게다가, 이 Effective Modern C++에서 기술적인 실수나 지루한 순간, 느슨한 문장을 만날 가능성은 이 책의 매력에 반비례하는 수준으로 아주 낮다.
―안드레이 알렉산드레스쿠(Andrei Alexandrescu), Ph.D, Facebook의 연구 과학자, Modern C++ Design의 저자

C++을 20년 넘게 경험한 사람이자 현대적 C++(의 모범 관행들과 피해야 할 함정들 모두)을 최대한 파악하려는 사람으로서, 나는 여러분이 이 책을 사서 숙독하고 자주 참고하길 강력히 권한다. 이 책을 읽으면서 내가 새로운 것들을 배웠음은 확실하다!
―네빈 리버(Nevin Liber), DRW Trading Group의 선임 소프트웨어 공학자

C++의 창시자인 비야네 스트롭스트룹Bjarne Stroustrup은 “C++11은 새로운 언어처럼 느껴진다”고 말했다. Effective Modern C++은 프로그래머가 일상적인 개발 업무에서 C++11과 C++14의 새로운 기능과 관용구를 활용하는 방법을 명확하게 설명함으로써 그와 같은 느낌을 공유하게 한다. 스콧 마이어스의 또 다른 훌륭한 책이다.
―카시오 네리(Cassio Neri, Lloyds Banking Group)의 외환 계량분석가(FX Quantitative Analyst

스콧은 기술적 복잡성을 이해 가능한 알맹이로 요약하는 데 능숙하다. 그의 Effective C++ 시리즈는 이전 세대 C++ 프로그래머들의 코딩 스타일을 기르는 데 도움을 주었다. 새 책 역시 현대적인 C++을 사용하는 프로그래머들의 코딩 스타일을 확립하는 역할을 하리라 생각한다.
―로저 오어(Roger Orr), OR/2 Limited(ISO C++ 표준위원회의 일원)

Effective Modern C++은 여러분의 현대적 C++ 능력을 향상하는 훌륭한 도구이다. 이 책은 현대적 C++을 언제, 어떻게, 어디에 사용하는 것이 효과적인지 가르칠 뿐만 아니라, 왜 그런지도 알려준다. 42개의 잘 계획된 항목들에 펼쳐진 스콧의 명확하고 통찰력 있는 글을 통해서, 프로그래머들은 C++ 언어를 훨씬 잘 이해하게 될 것이다.
―바르트 판데부스티너(Bart Vandewoestyne), 연구 개발 공학자이자 열성적인 C++ 애호가

나는 C++을 사랑한다. C++은 수십 년째 내 밥벌이 도구이다. 그리고 최근 추가된 기능들은 이전에 상상한 것보다 훨씬 강력하고 표현력이 크다. 그러나 선택할 것이 너무나 많아서, “이 기능들을 언제, 어떻게 적용할 것인가”라는 질문을 던지지 않을 수 없다. 그리고 항상 그랬듯이, 스콧의 Effectiv C++ 시리즈는 그 질문에 대한 궁극의 답이다.
―데미언 왓킨스(Damien Watkins), CSIRO의 계산 소프트웨어 공학팀 팀장

현대적 C++로 넘어가는 데 아주 유용한 이 책은 C++11/14 언어 기능들을 C++98과 함께 설명한다. 주제 항목들은 참조하기 쉬우며, 각 절 끝에는 조언이 요약되어 있다. 캐주얼한 C++ 개발자와 고급 C++ 개발자 모두에게 재밌고도 유용한 책이다.
―레이첼 쳉(Rachel Cheng), F5 Networks 소속

C++98/03에서 C++11/14로 넘어가려는 사람에게는 스콧이 Effective Modern C++에서 제공하는 두드러지게 실용적이고 명확한 정보가 필요하다. 이미 C++11 코드를 작성하고 있는 사람이라면, C++의 새로운 주요 기능들에 대한 스콧의 상세한 논의를 통해서 새 기능들의 문제점들을 발견할 수도 있다. 어떤 경우이든, 이 책은 시간을 들여 읽을 가치가 있다.
―롭 스튜어트(Rob Stewart), Boost Steering Committee 위원 (boost.org)

>> 리뷰 글에서
“C++11과 14에 추가된 기능들은 C++의 세계를 완전히 바꿨다. boost::bind나 boost::lambda를 통해 C++11의 lambda와 비슷한 기능을 구현하기 위해 몸부림치던 걸 봤던 독자라면 C++11이 얼마나 축복인지 이해할 것이다.
스콧 마이어스의 EMC++은 그런 변화점을 42개의 항목으로 나눠 자세히 설명하고 있다. Effective 시리즈의 이전 책들처럼 각 항목별로 예제를 통해 유용한 조언과 근거를 보여준다. 또한 C++14에서 추가로 개선된 부분을 따로 설명하여 C++11까지만 알고 있던 독자에게 변화된 부분을 바로 보여준다.
C++의 새 기능들을 깊이 이해하고 활용하고자 한다면 Effective Modern C++은 반드시 읽어야 할 책이다. 이전 Effective C++ 시리즈를 읽었던 분이라면 이미 이 책을 손에 들고 있을 거라 생각한다.”
—하재승

 

>> 목차
1장 형식 연역
항목 1: 템플릿 형식 연역 규칙을 숙지하라
항목 2: auto의 형식 연역 규칙을 숙지하라
항목 3: decltype의 작동 방식을 숙지하라
항목 4: 연역된 형식을 파악하는 방법을 알아두라

2장 auto
항목 5: 명시적 형식 선언보다는 auto를 선호하라
항목 6: auto가 원치 않은 형식으로 연역될 때에는 명시적 형식의 초기치를 사용하라

3장 현대적 C++에 적응하기
항목 7: 객체 생성 시 괄호(())와 중괄호({})를 구분하라
항목 8: 0과 NULL보다 nullptr를 선호하라
항목 9: typedef보다 별칭 선언을 선호하라
항목 10: 범위 없는 enum보다 범위 있는 enum을 선호하라
항목 11: 정의되지 않은 비공개 함수보다 삭제된 함수를 선호하라
항목 12: 재정의 함수들을 override로 선언하라
항목 13: iterator보다 const_iterator를 선호하라
항목 14: 예외를 방출하지 않을 함수는 noexcept로 선언하라
항목 15: 가능하면 항상 constexpr을 사용하라
항목 16: const 멤버 함수를 스레드에 안전하게 작성하라
항목 17: 특수 멤버 함수들의 자동 작성 조건을 숙지하라

4장 똑똑한 포인터
항목 18: 소유권 독점 자원의 관리에는 std::unique_ptr를 사용하라
항목 19: 소유권 공유 자원의 관리에는 std::shared_ptr를 사용하라
항목 20: std::shared_ptr처럼 작동하되 대상을 잃을 수도 있는 포인터가 필요하면 std::weak_ptr를 사용하라
항목 21: new를 직접 사용하는 것보다 std::make_unique와 std::make_shared를 선호하라
항목 22: Pimpl 관용구를 사용할 때에는 특수 멤버 함수들을 구현 파일에서 정의하라

5장 오른값 참조, 이동 의미론, 완벽 전달
항목 23: std::move와 std::forward를 숙지하라
항목 24: 보편 참조와 오른값 참조를 구별하라
항목 25: 오른값 참조에는 std::move를, 보편 참조에는 std::forward를 사용하라
항목 26: 보편 참조에 대한 중복적재를 피하라
항목 27: 보편 참조에 대한 중복적재 대신 사용할 수 있는 기법들을 알아두라
항목 28: 참조 축약을 숙지하라
항목 29: 이동 연산이 존재하지 않고, 저렴하지 않고, 적용되지 않는다고 가정하라
항목 30: 완벽 전달이 실패하는 경우들을 잘 알아두라

6장 람다 표현식
항목 31: 기본 갈무리 모드를 피하라
항목 32: 객체를 클로저 안으로 이동하려면 초기화 갈무리를 사용하라
항목 33: std::forward를 통해서 전달할 auto&& 매개변수에는 decltype을 사용하라
항목 34: std::bind보다 람다를 선호하라

7장 동시성 API
항목 35: 스레드 기반 프로그래밍보다 과제 기반 프로그래밍을 선호하라
항목 36: 비동기성이 필수일 때에는 std::launch::async를 지정하라
항목 37: std::thread들을 모든 경로에서 합류 불가능하게 만들어라
항목 38: 스레드 핸들 소멸자들의 다양한 행동 방식을 주의하라
항목 39: 단발성 사건 통신에는 void 미래 객체를 고려하라
항목 40: 동시성에는 std::atomic을 사용하고, volatile은 특별한 메모리에 사용하라

8장 다듬기
항목 41: 이동이 저렴하고 항상 복사되는 복사 가능 매개변수에 대해서는 값 전달을 고려하라
항목 42: 삽입 대신 생성 삽입을 고려하라