Top

[똑똑한 프로그래밍을 위한]
C++ 템플릿 가이드

  • 원서명C++ Templates: The Complete Guide (ISBN 9780201734843)
  • 지은이데이비드 반데보드, 니콜라이 조슈티스
  • 옮긴이한정애
  • ISBN : 9788960770676
  • 38,000원
  • 2008년 12월 16일 펴냄 (절판)
  • 페이퍼백 | 552쪽 | 188*250mm
  • 시리즈 : 프로그래밍 언어

판매처

  • 현재 이 도서는 구매할 수 없습니다.

책 소개

C++ 템플릿의 모든 것!
기초부터 고급, 이론부터 실전까지 차근차근 알기 쉽게 설명한 완벽 가이드


템플릿은 C++의 가장 강력한 기능 중 하나지만 너무나 등한시되고 잘못 알려져 있으며 잘못 사용되고 있다. 『똑똑한 프로그래밍을 위한 C++ 템플릿 가이드』는 템플릿을 왜 사용해야 하며, 언제 사용하고, 어떻게 사용해야 하는지 명확히 알려주므로 소프트웨어 설계자와 엔지니어는 좀 더 깔끔하고 빠르며 멋진 소프트웨어를 효율적으로 만들 수 있다.

이 책은 기본 개념과 언어 특성에 대한 직관적인 예제에서 시작한다. 그리고 언어의 상세 부분에 우선 초점을 맞춰 설명한 후 다양한 코딩 기술을 다루며, 마지막으로는 템플릿의 고급 응용방식을 알아봄으로써 광범위한 참고자료로도 사용할 수 있게 했다. 책 전반에서 사용된 예제들은 추상적인 개념을 쉽게 설명할 뿐만 아니라 최적의 응용 사례이기도 하다.


[ 소개 ]

이 책에서 가장 좋았던 점은 템플릿의 양면, 즉 템플릿의 구조와 사용법을 모두 보여준다는 점이었다. 디자인과 사용법을 모두 보여주는 책은 드물다. 예제들은 최상급일 뿐만 아니라 매우 간결하고 정말 잘 설명돼 있다.
패트릭 맥킬런 / Vision 정보 컨설팅

독자들이 결코 알고 싶어하지 않지만 꼭 알아야만 하는 템플릿. 이 책은 C++ 템플릿을 효과적으로 사용하는 데 필요한 모든 내용을 다룬다.
디트마르 퀼 / Phaidros eaSE

템플릿이 C++에 포함된 지 벌써 십년이 지났지만(그리고 다양한 형태로 사용될 수 있지만) 템플릿은 여전히 잘못 이해되고, 오용되거나 논쟁거리가 되고 있다. 한편 템플릿은 더 깔끔하고 빠르며 똑똑한 소프트웨어를 만들기 위한 강력한 도구로 사용된다. 템플릿은 새로운 C++ 프로그래밍 패러다임의 주춧돌이 될 것이다.

그러나 여전히 많은 책과 글이 C++ 템플릿의 이론과 애플리케이션을 피상적으로만 설명하고 있다. 일부 책에서 다양한 템플릿 기반 기술을 설명하고는 있지만 이러한 기술들이 C++ 언어에 의해 지원받는 부분에 대해 정확히 설명하진 않는다. 결국, 초보자는 물론이거니와 고급 C++ 프로그래머조차도 자신들이 만든 코드가 왜 예상과 다르게 동작하는지 알아내려면 템플릿과 씨름해야 한다.

현실에서 벌어지는 이러한 난제를 해결하기 위해 저자들은 이 책을 쓰기로 결심했다. 하지만 두 저자는 문제를 각자 다른 접근 방식을 통해 독립적으로 해결하려 했다.

데이비드는 C++ 템플릿 언어 메커니즘에 대한 상세 내용과 템플릿을 사용했을 때 쓸 수 있는 주요 고급 프로그래밍 테크닉에 대한 완벽한 참고 자료를 제공하는 데 최선을 다했다. 그는 정확하고 완벽하길 바랐다. 니코는 프로그래머로서 일상적으로 템플릿을 쉽게 사용할 수 있는 책을 만드는 데 관심이 있었다. 다시 말해서 템플릿의 실용적인 측면을 다루면서도 직관적으로 이해할 수 있는 책을 쓰고 싶어 했다.

어떻게 보면 과학자와 공학자 간의 격차처럼 보이는 이 두 가지 방식을 이 책에서는 모두 활용하기로 결정했다. 그러나 어느 정도 겹치기는 하겠지만 저자마다 강조한 부분은 차이가 있을 것이다.

애디슨웨슬리 출판사가 두 저자들을 맺어줌으로써 결국 상세한 참고자료가 들어있는 C++ 템플릿 입문서라 할 만한 이 책이 탄생하게 됐다. 『똑똑한 프로그래밍을 위한 C++ 템플릿 가이드』는 템플릿 입문서이며, 필요한 언어 요소에 대한 소개뿐 아니라 실용적인 해법을 위한 설계 기법도 함께 설명한다. 또한 C++ 템플릿 문법과 의미 구조를 넘어 잘 알려지거나 덜 알려진 템플릿 사용 방식과 기술에 대한 요약서이기도 하다.


[ 이 책에서 다루는 내용 ]

■ 템플릿의 정확한 동작
■ 템플릿과 관련된 함정을 피하는 방법
■ 기본적인 관용구에서부터 이전에 문서화된 적 없는 기술 전반
■ 성능이나 안전성을 침해하지 않으면서도 소스코드를 재사용하는 방법
■ C++ 프로그램의 효율성을 증가시키는 방법
■ 좀 더 유연하고 유지보수가 쉬운 소프트웨어를 만드는 방법


[ 이 책의 구성 ]

템플릿의 개념을 익히거나 다시 살펴보고 싶은 C++ 프로그래머라면 1부 “템플릿 기본”을 주의 깊게 읽자. 아직 템플릿을 잘 모른다면 1부를 먼저 읽고 앞으로 사용할 용어와 방식에 익숙해지는 편이 좋다. 1부는 템플릿을 포함하는 소스코드를 만들 경우 필요한 내용도 살펴본다.

각자의 학습 방식에 따라 2부 “템플릿 상세 설명”에서 다루는 템플릿의 자세한 내용까지 다 익히고 싶을 수도 있고, 3부 “템플릿과 설계”에 나오는 실용적인 코딩 기술에 더 신경을 쓸 수도 있다(좀 더 미묘한 언어 주제에 대한 내용은 2부를 참조하자). 일상에서 접하는 문제를 해결하기 위해 이 책을 샀다면 3부 내용이 도움이 될 것이다. 4부 “고급 애플리케이션”은 3부와 얼핏 유사하지만 설계 기술보다는 특정 애플리케이션을 위해 템플릿이 어떻게 사용되는가를 더욱 강조했다. 따라서 4부에 들어가기 앞서 3부의 내용을 숙지하는 편이 좋다.

부록에는 유용한 정보들이 다수 포함되어 있으므로 본문에서도 자주 부록을 언급할 것이다. 부록 또한 따로 읽을 만한 가치가 있도록 주의를 기울였다.


[ 소스코드 ]

책에서 기술을 익히려면 예제를 통해 살펴보는 편이 가장 빠르다. 이 책은 많은 예제를 제시하고 있다. 추상적인 개념을 드러내기 위해 코드 몇 줄로 보여주는 예제도 있지만, 견고한 애플리케이션을 제공하기 위한 완벽한 프로그램으로 만들어진 예제도 있다. 후자의 예제들은 해당 프로그램 코드를 설명하는 C++ 주석도 같이 제공된다. 예제 파일은 이 책의 웹사이트인 http://www.josuttis.com/tmplbook/나 한국어판 도서정보 페이지 http://www.acornpub.co.kr/book/cplustemplate에서 내려받을 수 있다.

저자/역자 소개

[ 저자 서문 ]

C++에 템플릿의 개념을 도입한 지도 벌써 10년이 넘었다. C++ 템플릿은 1990년 『주석이 달린 C++ 참조 매뉴얼』과 『ARM』[EllisStroustrupARM]이라는 출판물에도 나와 있으며, ARM이 출간되기 전에도 템플릿을 언급한 전문출판물이 있었다. 하지만 10년이 지나도록 이토록 황홀하고 복잡하며 강력한 C++ 기능인 템플릿에 대해 기초적인 개념을 충실히 설명하거나 고급 템플릿 기술을 설명한 문서는 거의 없었다. 템플릿을 설명한 문서 기근 현상을 해결하기 위해 우리들은 직접 템플릿에 관한 책을 쓰기로 마음먹었다(별로 겸손해보이지 않을지도 모르겠다).

하지만 우리가 이 문제에 접근하는 배경과 의도에는 몇 가지 차이가 있다. 데이비드는 숙련된 컴파일러 구현자이자 C++ 표준화위원회 코어 언어 워킹그룹의 멤버로서, 템플릿의 모든 강점(과 문제들)을 정확하고 상세하게 설명하고 싶어 했다. 니코는 “일반적인” 애플리케이션 프로그래머로 역시 C++ 표준화위원회 코어 언어 워킹그룹의 멤버이며, 템플릿을 사용하는 다양한 기술을 이해하고 이를 활용하는 방법에 관심이 많았다. 독자나 커뮤니티 회원들과 지식을 나눔으로써 더 이상 템플릿을 잘못 이해하거나 혼란스러워 하지 않기를 바랐다.

이 책에서는 일상적인 예제를 통해 템플릿의 개념뿐만 아니라 템플릿의 정확한 동작에 대해서도 상세하게 설명했다. 이 책은 템플릿의 기본 법칙에서 시작해 “템플릿 프로그래밍의 기술”까지 다루며, 정적 다형성, 정책 클래스, 메타프로그래밍, 표현식 템플릿과 같은 기법을 발견(혹은 재발견)하게 될 것이다. 또한 C++ 표준 라이브러리를 더 깊이 이해할 수 있게 대부분의 코드에서 템플릿을 사용할 것이다.

이 책을 쓰는 동안 많은 것을 배웠으며 무척 재미있었다. 여러분도 우리와 같은 느낌을 받길 원하며 이 책을 즐겨주길 바란다.


[ 저자 소개 ]

데이비드 반데보드 (www.vandevoorde.com)
에디슨 설계 그룹의 엔지니어로서 ANSI C++ 표준화위원회에서 활동 중인 멤버이며, 뉴스 그룹 comp.lang.c++.moderated의 공동 창설자다. 브뤼셀 프리 대학과 렌슬러 공대를 졸업했으며, 알고리즘 개발과 프로그래밍 언어, 강의 등에 관심이 많다.

니콜라이 조슈티스 (www.josuttis.com)
기술 컨설턴트로 통신, 트래픽, 금융과 제조업을 위한 객체 지향 소프트웨어를 설계하고 있다. C++ 표준화위원회 라이브러리 워킹그룹에서 활동 중이며, 『The C++ standard Library』(Addison-Wesley, 1999) 등 C++와 객체지향 프로그래밍에 관한 많은 책을 썼다.


[ 옮긴이의 말 ]

C++는 처음 배우는 사람들을 골탕 먹이기 위해 프로그래밍 언어 개발자들이 일부러 어렵게 만들었다는 음모론이 있다. 그 대표적인 예로 거론되는 것이 바로 템플릿이다. 템플릿으로 구현한 코드를 보고 있으면 프로그래밍 언어를 잘 안다고 자부하는 사람도 정신이 아득해지는 경험을 하곤 한다. 특수 기호로 가득한 코드를 따라가다 보면 출구를 알 수 없는 미로 속을 헤매는 듯한 답답함을 느끼기도 한다.

이 책은 바로 그 이상하다는 C++ 템플릿을 다룬다. 이 책에서 다루는 템플릿들은 딱 보기에도 어렵고 복잡할 뿐만 아니라 컴파일이라도 제대로 될지 의심스러운 C++ 문법들로 이뤄져 있다. 하지만 이 책의 친절한 설명을 따라 템플릿을 왜 만들었고 그 구조는 어떻게 되는지 차근차근 익혀나가다 보면 이상한 생김새가 친숙하게 느껴지기 시작할 것이다. 또한 C++ 템플릿이라는 게 생각보다 그리 어렵지만은 않으며 매우 편리하다는 사실도 알게 될 것이다. 특히 C++ 표준에 포함돼 있기 때문에 대부분의 컴파일러에서 바로 사용할 수 있는 STL(표준 템플릿 라이브러리)을 쓴다면 이제까지 그때그때 임기응변식으로 직접 작성해야 했던 오류 투성이 자료 구조(스택, 큐, 우선순위 큐 등) 대신 누군가가 템플릿으로 만들어 놓은 깔끔한 자료 구조나 알고리즘을 손쉽게 가져다 쓸 수 있어 템플릿의 편리함에 감탄하게 될 것이다.

이 책의 원서는 2002년에 출판됐지만 내용이 구닥다리라고 생각하면 오산이다. 템플릿 표준을 실제로 구현하는 것은 컴파일러 개발사의 몫이기 때문에 템플릿의 일부 고급 기능들은 최근에서야 제대로 지원되고 있다. 따라서 이 책을 읽고 템플릿을 실제 업무에 적용하기를 원한다면 가장 최신 버전의 컴파일러를 사용해야 할 것이다. 그만큼 이 책에서 다루는 내용은 현대적이며 C++ 프로그래밍에서 가장 높은 수준의 지식을 다루고 있다. 독자들이 이 책의 마지막 페이지를 덮었을 때 C++ 템플릿이 생각보다 편리하고 걱정한 것만큼 어렵지는 않다고 느꼈으면 한다. 물론, 쉽지는 않다.


[ 옮긴이 소개 ]

한정애
서울대학교 컴퓨터공학과를 졸업하고 동 대학원에 재학 중이다. 현재 세부 전공은 무선 통신 분야이지만 리눅스와 리눅스 프로그램 등을 포함한 컴퓨터와 관련된 다양한 분야에 관심이 많다. 역서로 에이콘출판사에서 출간한 『리눅스 실전 가이드』(2007), 『리눅스 기반의 임베디드 제품 디자인』(2007)이 있다.

목차

목차
  • | 1장 | 들어가며 ● 1
    • 1.1 이 책을 읽기 전에 독자가 알아야 할 것 ● 2
    • 1.2 이 책의 구성 ● 2
    • 1.3 이 책을 읽는 방법 ● 3
    • 1.4 프로그래밍 방식에 대한 몇 가지 언급 ● 3
    • 1.5 표준과 실제 ● 5
    • 1.6 예제 코드와 부가 설명 ● 6
    • 1.7 피드백 ● 6
  • 1부 템플릿 기본 ● 7
  • | 2장 | 함수 템플릿 ● 9
    • 2.1 함수 템플릿이란 ● 9
      • 2.1.1 템플릿 정의 ● 9
      • 2.1.2 템플릿 사용 ● 10
    • 2.2 인자 추론 ● 13
    • 2.3 템플릿 파라미터 ● 13
    • 2.4 오버로딩 함수 템플릿 ● 15
    • 2.5 요약 ● 20
  • | 3장 | 클래스 템플릿 ● 21
    • 3.1 클래스 템플릿 Stack의 구현 ● 21
      • 3.1.1 클래스 템플릿의 선언 ● 22
      • 3.1.2 멤버 함수의 구현 ● 24
    • 3.2 클래스 템플릿 Stack의 사용 ● 25
    • 3.3 클래스 템플릿의 특수화 ● 27
    • 3.4 부분 특수화 ● 29
    • 3.5 기본 템플릿 인자 ● 30
    • 3.6 요약 ● 33
  • | 4장 | 데이터형이 아닌 템플릿 파라미터 ● 35
    • 4.1 데이터형이 아닌 클래스 템플릿 파라미터 ● 35
    • 4.2 데이터형이 아닌 함수 템플릿 파라미터 ● 39
    • 4.3 데이터형이 아닌 템플릿 파라미터에 대한 제약 ● 40
    • 4.4 요약 ● 41
  • | 5장 | 고급 기능 ● 43
    • 5.1 키워드 typename ● 43
    • 5.2 this-> 사용 ● 45
    • 5.3 멤버 템플릿 ● 46
    • 5.4 템플릿 템플릿 파라미터 ● 50
    • 5.5 0 초기화 ● 56
    • 5.6 함수 템플릿에 문자열 리터럴을 인자로 사용 ● 57
    • 5.7 요약 ● 60
  • | 6장 | 템플릿 실제 사용 ● 61
    • 6.1 포함 모델 ● 61
      • 6.1.1 링커 오류 ● 61
      • 6.1.2 헤더 파일에 있는 템플릿 ● 63
    • 6.2 명시적 인스턴스화 ● 64
      • 6.2.1 명시적 인스턴스화의 예제 ● 65
      • 6.2.2 포함 모델과 명시적 인스턴스화 결합 ● 66
    • 6.3 분리 모델 ● 67
      • 6.3.1 키워드 export ● 67
      • 6.3.2 분리 모델의 한계 ● 69
      • 6.3.3 분리 모델에 대한 대비 ● 70
    • 6.4 템플릿과 인라인 ● 71
    • 6.5 전컴파일된 헤더 ● 72
    • 6.6 디버깅 템플릿 ● 74
      • 6.6.1 긴 오류 메시지 해석 ● 75
      • 6.6.2 얕은 인스턴스화 ● 77
      • 6.6.3 긴 기호 ● 79
      • 6.6.4 추적자 ● 79
      • 6.6.5 오라클 ● 84
      • 6.6.6 원형 ● 84
    • 6.7 정리 ● 85
    • 6.8 요약 ● 86
  • | 7장 | 기본 템플릿 용어 ● 87
    • 7.1 클래스 템플릿과 템플릿 클래스 ● 87
    • 7.2 인스턴스화와 특수화 ● 88
    • 7.3 선언과 정의 ● 89
    • 7.4 단정의 법칙 ● 90
    • 7.5 템플릿 인자와 템플릿 파라미터 ● 90
  • 2부 템플릿 상세 설명 ● 93
  • | 8장 | 템플릿 기초 원리의 깊은 이해 ● 95
    • 8.1 파라미터화된 선언 ● 95
      • 8.1.1 가상 멤버 함수 ● 98
      • 8.1.2 템플릿의 링크 ● 99
      • 8.1.3 기본 템플릿 ● 100
    • 8.2 템플릿 파라미터 ● 100
      • 8.2.1 데이터형 파라미터 ● 101
      • 8.2.2 데이터형이 아닌 파라미터 ● 101
      • 8.2.3 템플릿 템플릿 파라미터 ● 102
      • 8.2.4 기본 템플릿 인자 ● 104
    • 8.3 템플릿 인자 ● 104
      • 8.3.1 함수 템플릿 인자 ● 105
      • 8.3.2 데이터형 인자 ● 108
      • 8.3.3 데이터형이 아닌 인자 ● 109
      • 8.3.4 템플릿 템플릿 인자 ● 112
      • 8.3.5 동일 ● 113
    • 8.4 프렌드 ● 114
      • 8.4.1 프렌드 함수 ● 115
      • 8.4.2 프렌드 템플릿 ● 117
    • 8.5 정리 ● 118
  • | 9장 | 템플릿에서의 이름 ● 119
    • 9.1 이름 분류학 ● 119
    • 9.2 이름 룩업 ● 121
      • 9.2.1 인자 종속 룩업 ● 123
      • 9.2.2 프렌드 이름 주입 ● 125
      • 9.2.3 주입된 클래스 이름 ● 126
    • 9.3 템플릿 파싱 ● 127
      • 9.3.1 템플릿을 쓰지 않을 때의 문맥 민감성 ● 127
      • 9.3.2 데이터형의 종속 이름 ● 130
      • 9.3.3 템플릿의 종속 이름 ● 132
      • 9.3.4 using 선언에서 종속 이름 ● 133
      • 9.3.5 ADL과 명시적 템플릿 인자 ● 135
    • 9.4 파생과 클래스 템플릿 ● 135
      • 9.4.1 종속되지 않은 기본 클래스 ● 135
      • 9.4.2 종속적인 기본 클래스 ● 136
    • 9.5 정리 ● 139
  • | 10장 | 인스턴스화 ● 141
    • 10.1 주문형 인스턴스화 ● 141
    • 10.2 게으른 인스턴스화 ● 143
    • 10.3 C++ 인스턴스화 모델 ● 146
      • 10.3.1 두 단계 룩업 ● 146
      • 10.3.2 인스턴스화 지점 ● 147
      • 10.3.3 포함과 분리 모델 ● 150
      • 10.3.4 여러 번역 단위에 걸친 룩업 ● 150
      • 10.3.5 예제 ● 152
    • 10.4 구현 방식 ● 154
      • 10.4.1 근시안적인 인스턴스화 ● 156
      • 10.4.2 질의 인스턴스화 ● 157
      • 10.4.3 반복된 인스턴스화 ● 158
    • 10.5 명시적 인스턴스화 ● 161
    • 10.6 정리 ● 165
  • | 11장 | 템플릿 인자 추론 ● 167
    • 11.1 추론 과정 ● 167
    • 11.2 추론된 문맥 ● 170
    • 11.3 특별 추론 상황 ● 172
    • 11.4 허용되는 인자 변환 ● 172
    • 11.5 클래스 템플릿 파라미터 ● 173
    • 11.6 기본 호출 인자 ● 174
    • 11.7 바튼-넥만 트릭 ● 175
    • 11.8 정리 ● 177
  • | 12장 | 특수화와 오버로딩 ● 179
    • 12.1 “일반적인 코드”가 별로 좋지 않을 때 ● 179
      • 12.1.1 보이지 않는 커스터마이징 ● 180
      • 12.1.2 의미 구조 투명성 ● 181
    • 12.2 함수 템플릿 오버로딩 ● 183
      • 12.2.1 서명 ● 184
      • 12.2.2 오버로딩된 함수 템플릿의 부분 정렬 ● 186
      • 12.2.3 공식 정렬 법칙 ● 188
      • 12.2.4 템플릿과 템플릿이 아닌 것 ● 189
    • 12.3 명시적 특수화 ● 190
      • 12.3.1 전체 클래스 템플릿 특수화 ● 191
      • 12.3.2 전체 함수 템플릿 특수화 ● 195
      • 12.3.3 전체 멤버 특수화 ● 197
    • 12.4 부분 클래스 템플릿 특수화 ● 200
    • 12.5 정리 ● 203
  • | 13장 | 앞으로 나아갈 방향 ● 205
    • 13.1 꺾쇠 해킹 ● 205
    • 13.2 완화된 typename 법칙 ● 206
    • 13.3 기본 함수 템플릿 인자 ● 207
    • 13.4 문자열 리터럴과 부동소수점 템플릿 인자 ● 209
    • 13.5 템플릿 템플릿 파라미터의 일치 완화 ● 211
    • 13.6 typedef 템플릿 ● 212
    • 13.7 함수 템플릿의 부분 특수화 ● 213
    • 13.8 typeof 연산자 ● 215
    • 13.9 이름 붙여진 템플릿 인자 ● 217
    • 13.10 정적 속성 ● 218
    • 13.11 맞춤형 인스턴스화 진단 ● 218
    • 13.12 클래스 템플릿 오버로딩 ● 221
    • 13.13 목록 파라미터 ● 222
    • 13.14 레이아웃 제어 ● 224
    • 13.15 초기화 추론 ● 225
    • 13.16 함수 표현식 ● 226
    • 13.17 정리 ● 228
  • 3부 템플릿과 설계 ● 229
  • | 14장 | 템플릿의 다형성 능력 ● 231
    • 14.1 동적 다형성 ● 231
    • 14.2 정적 다형성 ● 234
    • 14.3 동적 다형성과 정적 다형성 비교 ● 237
    • 14.4 설계 패턴의 새로운 형태 ● 239
    • 14.5 일반 프로그래밍 ● 240
    • 14.6 정리 ● 242
  • | 15장 | 특질과 정책 클래스 ● 245
    • 15.1 예제: 수열 더하기 ● 246
      • 15.1.1 고정 특질 ● 246
      • 15.1.2 값 특질 ● 250
      • 15.1.3 파라미터화된 특질 ● 253
      • 15.1.4 정책과 정책 클래스 ● 255
      • 15.1.5 특질과 정책의 차이점 ● 257
      • 15.1.6 멤버 템플릿과 템플릿 템플릿 파라미터 ● 258
      • 15.1.7 다양한 정책과 특질 결합 ● 260
      • 15.1.8 일반 반복자를 통해 추적 ● 261
    • 15.2 데이터형 함수 ● 262
      • 15.2.1 요소의 데이터형 결정 ● 263
      • 15.2.2 클래스형 결정 ● 265
      • 15.2.3 참조자와 한정자 ● 267
      • 15.2.4 데이터형 승격 특질 ● 270
    • 15.3 정책 특질 ● 273
      • 15.3.1 읽기 전용 파라미터형 ● 274
      • 15.3.2 복사, 교환과 이동 ● 277
    • 15.4 정리 ● 282
  • | 16장 | 템플릿과 상속 ● 285
    • 16.1 이름 붙여진 템플릿 인자 ● 285
    • 16.2 빈 기본 클래스 최적화 ● 289
      • 16.2.1 레이아웃 원칙 ● 290
      • 16.2.2 기본 클래스로서의 멤버 ● 292
    • 16.3 묘하게 되풀이되는 템플릿 패턴 ● 295
    • 16.4 파라미터화된 가상성 ● 297
    • 16.5 정리 ● 299
  • | 17장 | 메타프로그래밍 ● 301
    • 17.1 메타프로그램의 첫 번째 예 ● 301
    • 17.2 열거형 값과 정적 상수 ● 303
    • 17.3 두 번째 예: 제곱근 구하기 ● 305
    • 17.4 유도 변수 사용 ● 309
    • 17.5 계산 완벽성 ● 312
    • 17.6 재귀적 인스턴스화와 재귀적 템플릿 인자 ● 313
    • 17.7 루프를 풀기 위한 메타프로그래밍 ● 314
    • 17.8 정리 ● 318
  • | 18장 | 표현식 템플릿 ● 321
    • 18.1 임시 루프와 루프 분할 ● 322
    • 18.2 템플릿 인자에 표현식 표현 ● 327
      • 18.2.1 표현식 템플릿의 피연산자 ● 328
      • 18.2.2 Array형 ● 332
      • 18.2.3 연산자 ● 334
      • 18.2.4 복습 ● 335
      • 18.2.5 표현식 템플릿 할당 ● 338
    • 18.3 표현식 템플릿의 성능과 한계 ● 339
    • 18.4 정리 ● 341
  • 4부 고급 애플리케이션 ● 345
  • | 19장 | 데이터형 분류 ● 347
    • 19.1 기초형 결정 ● 347
    • 19.2 복합형 결정 ● 350
    • 19.3 함수형 식별 ● 352
    • 19.4 오버로딩 해석으로 열거형 분류 ● 356
    • 19.5 클래스형 결정 ● 359
    • 19.6 모두 하나로 묶기 ● 359
    • 19.7 정리 ● 363
  • | 20장 | 스마트 포인터 ● 365
    • 20.1 소유자와 전달 캡슐 ● 365
      • 20.1.1 예외로부터 보호 ● 366
      • 20.1.2 소유자 ● 368
      • 20.1.3 멤버로서의 소유자 ● 370
      • 20.1.4 자원 획득은 초기화다 ● 372
      • 20.1.5 Holder 한계 ● 373
      • 20.1.6 소유자 복사 ● 375
      • 20.1.7 함수 호출 너머로 소유자 복사 ● 375
      • 20.1.8 전달 캡슐 ● 376
    • 20.2 참조 카운트 ● 379
      • 20.2.1 카운터 위치 ● 380
      • 20.2.2 동시 카운터 접근 ● 381
      • 20.2.3 소멸과 할당 해제 ● 382
      • 20.2.4 CountingPtr 템플릿 ● 383
      • 20.2.5 간단한 비침습성 카운터 ● 386
      • 20.2.6 간단한 침습성 카운터 템플릿 ● 388
      • 20.2.7 상수성 ● 389
      • 20.2.8 묵시적 변환 ● 390
      • 20.2.9 비교 ● 393
    • 20.3 정리 ● 394
  • | 21장 | 튜플 ● 395
    • 21.1 듀오 ● 395
    • 21.2 재귀적 듀오 ● 401
      • 21.2.1 필드의 수 ● 401
      • 21.2.2 필드의 데이터형 ● 403
      • 21.2.3 필드의 값 ● 404
    • 21.3 튜플 생성 ● 410
    • 21.4 정리 ● 415
  • | 22장 | 함수 객체와 콜백 ● 417
    • 22.1 직접/간접과 인라인 호출 ● 418
    • 22.2 함수에 대한 포인터와 참조자 ● 421
    • 22.3 멤버 접근 포인터 함수 ● 423
    • 22.4 클래스형 functor ● 427
      • 22.4.1 첫 번째 클래스형 functor ● 427
      • 22.4.2 클래스형 functor의 종류 ● 428
    • 22.5 functor 명시 ● 430
      • 22.5.1 템플릿형 인자로서의 functor ● 430
      • 22.5.2 함수 호출 인자로서의 functor ● 431
      • 22.5.3 함수 호출 파라미터와 템플릿형 파라미터 결합 ● 432
      • 22.5.4 데이터형이 아닌 템플릿 인자로서의 functor ● 433
      • 22.5.5 함수 포인터 캡슐화 ● 434
    • 22.6 내부 점검 ● 437
      • 22.6.1 functor형 분석 ● 438
      • 22.6.2 파라미터형 접근 ● 438
      • 22.6.3 함수 포인터 캡슐화 ● 440
    • 22.7 함수 객체 조합 ● 446
      • 22.7.1 간단한 조합 ● 447
      • 22.7.2 혼합된 데이터형 조합 ● 451
      • 22.7.3 파라미터의 수 줄이기 ● 455
    • 22.8 값 바인더 ● 458
      • 22.8.1 바인딩 선택 ● 459
      • 22.8.2 바인드 서명 ● 461
      • 22.8.3 인자 선택 ● 462
      • 22.8.4 편의 함수 ● 468
    • 22.9 functor 연산: 전체 구현 ● 471
    • 22.10 정리 ● 474
  • | 부록A | 단정의 법칙 ● 475
    • A.1 번역 단위 ● 475
    • A.2 선언과 정의 ● 476
    • A.3 상세한 단정의 법칙 ● 477
      • A.3.1 프로그램당 한 번 ● 477
      • A.3.2 번역 단위별 한 번으로 정의 제약 ● 480
      • A.3.3 교차 번역 단위 동등 제약 ● 481
  • | 부록B | 오버로딩 해석 ● 487
    • B.1 오버로딩 해석이 적용되는 시기 ● 488
    • B.2 간략화된 오버로딩 해석 ● 488
      • B.2.1 멤버 함수를 위해 포함된 인자 ● 491
      • B.2.2 완벽한 일치 개선 ● 492
    • B.3 세부 오버로딩 ● 493
      • B.3.1 비템플릿 선호 ● 494
      • B.3.2 변환 순서 ● 494
      • B.3.3 포인터 변환 ● 495
      • B.3.4 functor와 대리 함수 ● 496
      • B.3.5 그 외 오버로딩 문맥 ● 497
  • 참조 목록 ● 499

관련 블로그 글

손쉽고 편하게! 똑똑한 프로그래밍을 위한 C++ 템플릿
사용자 삽입 이미지
똑똑한 프로그래밍을 위한 C++ 템플릿 가이드
데이비드 반데보드, 니콜라이 조슈티스 지음 | 한정애 옮김 |
552쪽 | 2008년 12월 16일 출간 예정 | ISBN 9788960770676 | 38,000원


똘이와 둥이는 같은 회사에 입사해 같은 부서에 배치를 받았습니다. 둘이 하는 일이 아주 똑같지는 않지만, 어느 회사나 그렇듯 얼추 비슷한 일을 같은 시간 안에 해내야 합니다.

입사 일주일쯤 지났군요. 똘이는 수많은 업무 중에 반복되는 패턴과 작업을 금세 파악해내고 자신만의 특정한 틀을 만들어냅니다. 틀을 만들어내느라 시간이 조금 걸리긴 했지만 앞으로 시간이 크게 줄어들 것을 생각하며 안도의 한숨을 내쉽니다. 한편 둥이는 업무에 바빠 바로바로 신속히 일을 처리하는 데 더욱 몰두합니다. 틀을 만드는 시간에 하나라도 빨리 처리하자며 "완벽하게"를 읖조립니다.

'하늘 아래 새로운 것은 없다'죠. 한달이 지나고, 1년, 몇 년 후, 누구의 효율이 더 높았을지는 불보듯 뻔한 일입니다. 열심히 공부하는 것 같은데, 늘 책상머리에 앉아있는데도 성적은 고만고만한 학생과 몇시간 책을 펴든 시간은 길지 않아 보이는데 늘 우등생 자리를 놓지 않는 학생. 뭔가 비법이 있는 게죠.

자신만의 비법. 틀. 패턴. 열심히 노력한다는 건 매우 훌륭한 일이지만, 질러 갈 수 있는 지름길을 눈앞에 뻔히 두고도 먼 비포장도로로 돌아가는 것은 정말 어리석은 짓이 아닐 수 없습니다. 하지만 비법을 만들어내고 익힌다는 것은 사실 말만 번지르르하지 쉬운 일이 아닙니다. 좌절하는 일도 생기고 눈물을 머금는 일도 생기지만 누군가 가이드를 해준다면 그 어려운 산을 넘는 데 조금은 힘이 되지 않겠습니까?

기초부터 고급까지, 완전무결한 C++ 템플릿 완벽 가이드

C++ 템플릿(template)은 ANSI C++ 표준에 포함된 C++의 언어적 기능입니다. C++ 프로그래밍에서 템플릿을 활용한 함수나 클래스, 라이브러리 등에서는 데이터 형에 무관하게 인자로서 건네받은 데이터 형에 따라 해당 기능을 오류없이 처리할 수 있습니다.

템플릿을 쓰면?

손쉽다.
개발이 빨라진다.
고민이 줄어든다.
재사용이 가능하다.
편해진다.
효율이 높다.

고로, 똑똑한 프로그래밍을 할 수 있다!!

그런데 왜 이처럼 좋은 템플릿을 두고도 사람들은 잘 활용하지 못하는 걸까요?

"템플릿을 쓰면 쉬워진다더라!"는 이야기는 숱하게 들어왔으니,
'한번 해볼까'하고 시작해봤는데....

STL(Standard Template Library)은 당최 뭥미? OTL...
템플릿 메타프로그래밍 공부하다 C++ 포기하고 자바로 되돌아갔다더라!!!

이 모두 C++ 템플릿과 관련해 전설처럼 들려온 이야기입니다. "템플릿"이라는 묘약을 손에 얻고자 강호의 프로그래머들이 눈물을 머금고 비법을 익히고자 노력했으나 모두 어느 시점에 가서 좌절하기에 이르죠.

템플릿은 어려워!! @#(&%*&%*(&*#$

하지만 과연 템플릿은 쓰잘데없고 복잡하기 만한 기능일까요?
아니면 "저 포도는 시고 맛도 없을 게 분명해"라고 버려둔 "여우의 신 포도"일까요?

이런 현실을 개탄해 데이비드 반데보그와 니콜라이 조슈티스가 분연히 의기 투합해 함께 책을 쓰기로 결정했다고 하죠. 데이비드는 C++ 템플릿 언어 구조를 상세히 설명하고 템플릿을 사용할 때 쓸 수 있는 주요 고급 프로그래밍 테크닉을 자세히 설명합니다. 한편 실용주의자 니콜라이는 프로그래머로서 자신의 경험을 되살려 템플릿의 실용적인 측면을 강조하고 직관적인 내용을 담아 책을 씁니다.

반짝반짝 빛나는 아마존 서평 별 5개★★★★★를 자랑스럽게 달고 있는 이 책 원서 C++ Templates: The Complete Guide 서평을 읽으시면 아시겠지만, 절대적이고도 상대적인 C++ 템플릿 참고서에 목말라했던 개발자들의 궁금증과 지적갈증을 모두 해소시켜 줍니다.

우리나라에 출간된 책들도 단지 STL 위주로 설명을 하거나 메타프로그래밍 개념을 다룬 고급서만 있었기에, 『똑똑한 프로그래밍을 위한 C++ 템플릿 가이드』처럼 기초부터 활용, 고급내용까지 두루 훑어주는 책 한 권이면 이제 여러분도 똑똑한 프로그래밍을 할 수 있는 고급 C++ 개발자로 쑥! 렙업이 가능할 거라 생각합니다.

이 책은 1부. 템플릿에 대한 기본 개념. 2부. 언어의 구체적인 부분을 제시하고 템프릿과 관련된 참고자료 제공. 3부. C++ 템플릿으로 제공되는 기본적인 설계 기술 설명. 4부. 기술을 활용하는 템플릿의 다양하고 대중적인 애플리케이션까지 C++ 템플릿의 모든 것을 설명합니다.

특히 실제로 활용가능한 크고 작은 예제를 모두 담아서, 실제로 어떻게 끌어다 쓰고 직접 만들 수 있는지, 어떤 부분을 수정하고 바꾸면 실전에서 활용가능한지를 세세히 알려주는 실용서의 역할까지 해줍니다.

C++에 템플릿의 개념을 도입한 지도 벌써 10년이 넘었다. 하지만 10년이 지나도록 이토록 황홀하고 복잡하며 강력한 C++ 기능인 템플릿에 대해 기초적인 개념을 충실히 설명하거나 고급 템플릿 기술을 설명한 문서는 거의 없었다. 템플릿을 설명한 문서 기근 현상을 해결하기 위해 우리들은 직접 템플릿에 관한 책을 쓰기로 마음먹었다(별로 겸손해보이진 않을지도 모르겠다).
- 저자 서문 중에서

역자 한정애님은 옮긴이의 말에서 더욱 간결하고 재미있게 이 책을 표현해주셨습니다. 한번 읽어보세요!

C++는 처음 배우는 사람들을 골탕 먹이기 위해 프로그래밍 언어 개발자들이 일부러 어렵게 만들었다는 음모론이 있다. 그 대표적인 예로 거론되는 것이 바로 템플릿이다. 템플릿으로 구현한 코드를 보고 있으면 프로그래밍 언어를 잘 안다고 자부하는 사람도 정신이 아득해지는 경험을 하곤 한다. 특수 기호로 가득한 코드를 따라가다 보면 출구를 알 수 없는 미로 속을 헤매는 듯한 답답함을 느끼기도 한다.

이 책은 바로 그 이상하다는 C++ 템플릿을 다룬다. 이 책에서 다루는 템플릿들은 딱 보기에도 어렵고 복잡할 뿐만 아니라 컴파일이라도 제대로 될지 의심스러운 C++ 문법들로 이뤄져 있다. 하지만 이 책의 친절한 설명을 따라 템플릿을 왜 만들었고 그 구조는 어떻게 되는지 차근차근 익혀나가다 보면 이상한 생김새가 친숙하게 느껴지기 시작할 것이다.

또한 C++ 템플릿이라는 게 생각보다 그리 어렵지만은 않으며 매우 편리하다는 사실도 알게 될 것이다. 특히 C++ 표준에 포함돼 있기 때문에 대부분의 컴파일러에서 바로 사용할 수 있는 STL(표준 템플릿 라이브러리)을 쓴다면 이제까지 그때그때 임기응변식으로 직접 작성해야 했던 오류 투성이 자료 구조(스택, 큐, 우선순위 큐 등)대신 누군가가 템플릿으로 만들어 놓은 깔끔한 자료 구조나 알고리즘을 손쉽게 가져다 쓸 수 있어 템플릿의 편리함에 감탄하게 될 것이다.

이 책의 원서는 2002년에 출판됐지만 내용이 구닥다리라고 생각하면 오산이다. 템플릿 표준을 실제로 구현하는 것은 컴파일러 개발사의 몫이기 때문에 템플릿의 일부 고급 기능들은 최근에서야 제대로 지원되고 있다. 따라서 이 책을 읽고 템플릿을 실제 업무에 적용하기를 원한다면 가장 최신 버전의 컴파일러를 사용해야 할 것이다. 그만큼 이 책에서 다루는 내용은 현대적이며 C++ 프로그래밍에서 가장 높은 수준의 지식을 다루고 있다.

독자들이 이 책의 마지막 페이지를 덮었을 때 C++ 템플릿이 생각보다 편리하고 걱정한 것만큼 어렵지는 않다고 느꼈으면 한다. 물론, 쉽지는 않다.

똑똑한 프로그래밍을 위한 C++ 템플릿 가이드』는 YES24, 교보문고, 강컴, 인터파크, 알라딘에서 예약판매중입니다. 여러분의 행복한 C++ 프로그래밍을 위해! 이제 C++의 세계에 폭 빠져 보세요~ ^^/

CC

크리에이티브 커먼즈 라이센스 이 저작물은 크리에이티브 커먼즈 코리아 저작자표시 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.

도서 오류 신고

도서 오류 신고

에이콘출판사에 관심을 가져 주셔서 고맙습니다. 도서의 오탈자 정보를 알려주시면 다음 개정판 인쇄 시 반영하겠습니다.

오탈자 정보는 다음과 같이 입력해 주시면 됩니다.

(예시) p.100 아래에서 3행 : '몇일'동안 -> 며칠동안

정오표

[ p67 2행 ]
정의 헤더 파일 stackdef.hpp 파일에 포함시키면 → 정의 헤더 파일 stackdef.hpp 포함시키면

[ p96 8행 주석 ]
// 네임스페이스 함수 템플릿 → // 네임스페이스 영역 함수 템플릿

[ p145 두 번째 문단 마지막 문장 ]
이것처럼, 멤버 anonymous는 Safe<T> 대신 Danger<N> 형으로 선언됐으나 Danger<0>이 완성될 수 없기 때문에 오류가 발생한다.
→ 같은 이유로, Tricky 내에서 선언된 (이름이 선언되지 않은) 공용체의 멤버인 anonymous가 Safe<T>형이 아닌 Danger<N>형으로 선언될 경우, Danger<0>는 생성될 수 없으므로 오류가 발생한다.