Top

비기닝 ANSI C++ [완벽한 언어표준 기초부터 차근차근]

  • 원서명Ivor Horton's Beginning ANSI C++: The Complete Language, Third Edition (ISBN 1590592271)
  • 지은이Ivor Horton
  • 옮긴이이정문
  • ISBN : 9788989975762
  • 40,000원
  • 2008년 04월 30일 펴냄
  • 페이퍼백 | 1,128쪽 | 188*250mm
  • 시리즈 : 프로그래밍 언어

책 소개

아래 GitHub 링크에서 소스 코드 등 도서와 관련한 파일을 다운로드하실 수 있습니다.
https://github.com/apress/ivor-horton-beg-ansi-cpp

# 요약

초보자를 위한 표준 C++설명서로서 문법, 객체 지향 기능, 표준 라이브러리 등 C++의 모든 기본을 다룬다. 직접 C++ 프로그램을 작성하는 데 필요한 노하우로 가득 차 있는 표준 ANSI C++ 결정판이다.


[ 책 소개 ]

왜 C++인가?

C++는 현재 가장 널리 사용되고 있는 프로그래밍 언어라고 할 수 있다. C++의 유연성, 강력함, 효율성 덕분에 C++는 전문적인 애플리케이션 개발에 흔히 사용된다. 특히 여러 플랫폼상에서 동작해야 하는 고성능 프로그램을 작성하는 데 있어서 C++는 적수가 없다.

또 C++는 흔히 생각하는 것보다 사용하기가 쉽다. 안내만 제대로 받는다면 C++에 대한 감을 쉽게 잡을 수 있다. C++ 코딩 방법을 습득한다는 것은 수백만 명이 이미 사용 중인 언어를 배우는 것이며, 어떤 프로그래밍 도구보다도 강력한 새로운 도구를 여러분의 도구 상자에 추가하게 되는 것이다.

C++ 표준

1998년 C++ 국제 표준인 ISO/IEC 14882가 최종적으로 승인하고, ANSI(American National Standard Institute)와 INCITS(International Committee for Information Technology Standards)에서 수용했다.

C++ 표준안은 어떤 하드웨어나 운영체제 환경 하에서도 컴파일러 개발 시의 참조 모델로서 사용될 수 있도록 정의된 것이다. 또 어떤 개발 환경에서도 성능을 극대화하기 위한 의도로 정의된 것이기도 하다. 이 말은 곧 컴파일러 제작자는 기계의 구조 상 차이로 인해 다양한 영역에서 상당 수준의 유연성을 지닌다는 뜻이다. 예를 들어 수치 자료와 산술 연산과 관련된 정의는 컴파일러 제작자가 특정 플랫폼에서의 실행 속도를 최적화하기 위해 그 플랫폼의 고유한 특징을 완전히 활용할 수 있도록 정의된다. 컴파일러 제작자는 또 C++프로그램을 정의하기 위해 사용되는 문자 인코딩 방식을 선택할 수도 있다. 이런 식으로 기본 문자 인코딩의 차이, 운영 체제의 차이로 인한 변형은 다양하게 존재할 수 있다. 이와 같은 유연성이 없다면 표준안은 성능 저하를 부르는 제약을 강제할 뿐일 것이며 이는 범용 프로그래밍 언어로서 바람직한 특징이라 볼 수 없다.

이 책에서는 플랫폼 간 중요한 차이점을 설명한다. 하지만 동일한 결과를 보여줘야 하는 책의 특성상 이 책의 예제는 모두 인텔 CPU를 사용하는 PC에서 실행했다.

저자/역자 소개

[ 저자 소개 ]

Ivor Horton
수학을 전공했으나 학부 졸업 후 컴퓨터를 갖고 노는 데 심취해 지금에 이르렀다. 다양한 언어로 쓸만한 애플리케이션을 작성해왔으며, 과학자와 엔지니어 대상의 강의에도 많은 시간을 보냈다. 공학 설계와 제조 공정에 컴퓨터를 응용하는 문제에 있어 경험이 많으며, C, C++, 자바 프로그래밍을 다룬 다수의 서적을 집필했다. 책을 집필하거나 컨설팅을 하지 않는 시간에는 다양한 레저 활동을 즐긴다.


[ 저자 서문 ]

C++는 크고 강력한 언어입니다. 수많은 프로들이 C++를 선택하는 이유이기도 합니다. 유난히 C++를 어려워하는 초심자들이 많습니다. 아마도 C++가 어떤 언어보다도 더욱 강력하고 폭넓은 기능을 제공하기에 좀 더 복잡해 보이기 때문일 것입니다. 하지만 C++는 그렇게 배우기 힘든 언어는 아닙니다. 단지 배워야 할 내용이 많을 뿐이죠.

C++를 가능한 한 쉽게 접근할 수 있도록 하는 데 이 책의 목적을 뒀습니다. 독자 여러분이 과거에 어떤 프로그래밍을 해봤든 아무 상관없습니다. 프로그래밍이 무엇인가에 관한 대략적인 개념만 있으면 됩니다. 그 밖에 모든 것은 이 책에 다 들어 있습니다. C++의 모든 특징이 예제와 함께 제공되며, 각 장을 마치기 전 연습문제를 통해 배운 내용을 테스트해볼 수도 있습니다. 또 단순히 어떻게 동작하는가를 보여주는 것이 아니라 왜 그렇게 동작해야 하는가를 보여주는 예제들을 통해, C++의 세부 고급 기능까지 배우고 이해할 수 있을 것입니다. 각 장은 이전 장의 내용을 바탕으로 하기 때문에 C++ 프로그래밍 기법을 점진적으로 발전시킬 수 있습니다.

C++를 배우는 것이 어렵지는 않지만 그렇다고 수월하지도 않을 것입니다. 초심자의 입장에서 1,000페이지가 넘는 내용은 부담스럽게 느껴질 수도 있습니다. 하지만 이 책을 읽는 독자들이 어느 정도의 프로그래밍 소질과 조금은 노력해볼 마음가짐과 열정을 지녔다면 누구나 이 책을 읽고 난 후 실력 있는 C++ 프로그래머로 거듭날 수 있을 것이라 확신합니다. 배워야 할 내용도 많겠지만 그만큼 흥미도 많이 느낄 수 있습니다. 그리고 가장 강력한 프로그래밍 언어를 정복했다는 성취감을 맛보게 될 것입니다.


[ 감수자 소개 ]

Gabriel Dos Reis
프랑스의 Ecole Normale Superieure de Cachan과 Universite Paris VII에서 박사 학위를 받았으며, ISO C++ 위원회와 C 및 C++ 전문가 그룹인 AFNOR(프랑스의 표준 위원회)에서 적극적으로 활동하고 있다. 1996년 이후 과학 기술 분야에 C++와 제네릭 프로그래밍을 응용하는 방법에 관해 연구하고 있는데, 특히 다항 연립방정식 알고리즘에서 CAD에 이르기까지 다양한 분야의 국제 협력 프로젝트에 참가하고 있다. GNU C++ 표준 라이브러리의 기여자이며, GNU 컴파일러 묶음의 릴리즈 매니저이기도 하다. 전 세계 C++ 컨퍼런스에 자주 연사로 초빙되는 감수자의 주요 연구 주제는 미분 기하학, 과학기술 수치해석, 제네릭 프로그래밍, 프로그래밍 도구와 기법 등의 컴퓨터 과학 방법론이다.


[ 역자 소개 ]

이정문
서울대학교 컴퓨터 공학과와 동 대학원을 졸업하였으며, 주요 관심사는 OS 구조와 자바 프로그래밍이다. 번역서로는『오픈소스 BSD 돌아온 전설』(에이콘출판, 2003),『UML 객체지향 모델링: Rational XDE로 하는』(에이콘출판, 2006) 등이 있다.


[ 역자 서문 ]

세상에는 많은 프로그래밍 언어가 있습니다. 하지만 범용성과 성능을 모두 고려할 때 C++만큼 좋은 언어는 없습니다. 예를 들어 비주얼 베이직(Visual Basic)은 그림을 그리듯 사용자 인터페이스를 설계하고 코드를 덧붙이기 때문에 프로그램의 개발 속도가 빠르지만 만들 수 있는 응용프로그램 크기에 한계가 있고 실행 속도도 느립니다. 반면에 어셈블리(Assembly)는 하드웨어를 직접 다루는 데 적합해서 속도가 매우 빠르고, 특히 디바이스 드라이버를 작성할 때는 매우 유용하겠지만 일반적인 응용프로그램을 어셈블리로 작성하려 했다간 머리가 모두 빠질 것입니다. 언제 다 만들 수 있을지 기약할 수 없는 것은 둘째치고라도 말이죠. 그럼 자바는 어떨까요? 역자도 자바를 무척 좋아합니다. C++가 C를 기반으로 한 데 반해 자바는 완전히 새로 나온 언어이기 때문에 C++보다 세련되고 깔끔합니다. 하지만 자바는 JVM이라는 가상 기계 위에서 실행되기 때문에 아쉽게도 실행 속도 측면에서 C++를 따라가지 못합니다.

이런 이유로 인해, 성능이 중시되는 대규모 응용프로그램을 작성하는 데 있어 C++는 가장 널리 사용됩니다. 하지만 세상에 공짜 점심은 없는 법. C++는 상대적으로 배우기 어렵다는 인식이 널리 퍼져 있습니다. 그것은 C++가 원래 어려워서라기보다는 C++가 제공하는 기능이 워낙 방대해서 그렇습니다. C++는 C 언어를 부분 집합으로서 포함하고 있는 ‘더 나은 C’ 이기 때문에 C의 강점을 모두 안으면서 동시에 객체 지향 프로그래밍의 장점을 비롯한 다양한 개선점이 추가되었기 때문입니다. 그렇다면 C를 먼저 배우고 나서 C++를 배우는 것이 낫지 않느냐는 생각이 들 수도 있습니다. 이에 대해서는 다양한 의견이 있지만 굳이 그럴 필요는 없다는 것이 역자의 생각입니다. C++가 개선됨으로써 필요성이 사라진 C 기능도 여럿 있기 때문입니다. 배울 필요가 없다면 안 배우는 것이 낫겠죠. 혹은 배우더라도 안 쓰는 편이 낫다는 정도는 알고 있어야 합니다. 우리 인생에는 안 그래도 배워야 할 것이 너무 많지 않습니까?

C++ 책으로 가장 유명한 것은 C++의 창시자 비야네 스트로스트럽(Bjarne Stroustrup)이 직접 쓴『The C++ Programming Language』가 있습니다. 이 책은 C++의 아버지가 쓴 것이니만큼 그 권위에 있어 비견할 데가 없는 C++의 바이블입니다만 초심자가 보기에는 어렵기로도 정평이 나 있습니다. 한 마디로 말해 어느 정도 C++의 기초가 잡힌 다음에 읽어야 완벽히 소화할 수 있는 책이죠. 따라서 C++를 시작하고자 하는 분들은 이 책『비기닝 ANSI C++』를 먼저 읽길 권합니다. 제목에서 알 수 있듯이 C++를 시작하는 독자를 대상으로 하고 있는데, 그렇다고 해서 단순한 입문용 서적은 아닙니다.

1,000페이지가 넘는 분량에 C++의 중요한 기능들을 빠짐없이 설명하고 있을 뿐 아니라, 좋은 프로그래밍을 위한 귀중한 조언도 두루 실려 있습니다. 고백하건대, 역자 역시 이 책을 번역해 나가면서 본서가 다루는 내용의 깊이에 놀란 적이 한두 번이 아닙니다.

제가 번역을 하는 데 있어 항상 가장 주안점을 두는 것은 자연스러운 우리말 표현입니다. 물론 내용을 충실히 번역하는 것이 기본이지만 내용을 훼손하지 않는 범위에서 번역체의 느낌이 나지 않게 최선을 다 했습니다. 용어는 가장 널리 받아들여지고 있는 것을 선택했으며, 많은 경우 구글이 색인한 웹페이지 수를 기준으로 했음을 밝힙니다. 제가 번역한 책을 누군가가 읽는다고 생각하면 항상 무거운 책임감을 느끼게 됩니다. 그래서 제 능력이 닿는 한 최선의 결과물을 내놓으려고 노력하지만 역자의 능력 부족으로 인해 미치지 못하는 부분이 있을 수 있습니다. 문제점을 발견하신 분은 언제라도 제 메일 계정으로 보내주시면 감사하겠습니다.

목차

목차
  • 01장 기본 개념 1 1
    • 프로그래밍 언어 1
      • 간략한 역사 2
      • 인터프리트 방식과 컴파일 방식 3
      • 라이브러리 4
    • 왜 C++는 위대한 언어인가 5
      • ANSI/ISO C++ 표준 5
    • 간단한 C++ 프로그램 6
      • 이름 8
      • 네임스페이스 10
    • 키워드 12
    • C++ 문장과 문장 블록 13
      • 코드 프레젠테이션 스타일 14
    • 프로그램의 구조 14
      • 함수의 실행 16
    • 소스 파일로부터 실행 프로그램의 생성 16
      • 컴파일 18
      • 링크 19
    • C++ 소스 파일에 사용되는 문자 20
      • UCS 21
      • 삼중자 21
      • 이스케이프 문자열 22
      • 문장 내의 공백문자 26
    • 프로그램에 주석달기 27
    • 표준 라이브러리 28
    • C++ 프로그래밍 29
      • 절차적 프로그래밍과 객체 지향 프로그래밍 30
    • 요약 31
    • 연습문제 32
  • 02장 기본 데이터 타입 35
    • 데이터와 데이터 타입 35
    • 간단한 연산의 수행 36
      • 리터럴이란 36
      • 정수 리터럴 37
      • 정수 산술 연산 39
      • 연산자의 우선순위와 결합 순서 43
    • 변수를 사용하는 방법 46
      • 변수 이름 46
    • 정수 변수 47
      • 정수 변수의 종류 50
      • 정수의 범위 53
      • 정수 리터럴의 타입 54
    • 대입 연산자 56
      • 다중 대입 57
      • 변수의 값 변경 58
    • 정수의 값을 증가시키거나 감소시키는 방법 60
      • 후위 증가 연산과 감소 연산 61
    • const 키워드 62
    • 정수를 위한 수치 함수 65
      • 임의의 수치 생성 67
    • 실수 연산 70
      • 실수 데이터 타입 71
      • 실수 연산 72
      • 실수 값을 다룰 때의 주의사항 76
      • 수학 함수 79
    • 문자의 사용 방법 81
      • 문자 리터럴 81
      • char 변수의 초기화 83
      • 확장 문자 집합에 의한 작업 86
    • 초기 값을 함수 표기로 나타내는 방법 87
    • 요약 88
    • 연습문제 89
  • 03장 기본 데이터 타입 - 더 자세한 이야기 91
    • 혼합 수식 91
      • 대입 연산 중의 타입 변환 93
      • 명시적 타입 변환 94
      • C 스타일의 타입 변환 97
    • 타입의 재발견 99
      • 한계를 찾아서 102
    • 비트 단위 연산자 104
      • 비트 단위 이동 연산자 105
      • 비트 논리 연산 108
    • 열거자 데이터 타입 119
      • 익명 열거자 121
      • 정수와 열거자 타입 간의 타입 변환 121
    • 데이터 타입의 동의어 124
    • 변수의 수명 126
      • 자동 변수 126
      • 변수 선언 위치 129
      • 전역 변수 129
      • 정적 변수 133
    • volatile 변경자 134
    • 외부 변수 선언 134
    • 우선순위와 결합 순서 135
    • 요약 136
    • 연습문제 137
  • 04장 선택과 결정 139
    • 데이터 값 비교 139
      • 비교 연산자를 사용하는 방법 140
      • 실수의 값 비교 143
    • if문 143
      • 중첩 if문 147
    • if-else문 153
      • 중첩 if-else문 156
    • 논리 연산자 159
      • 논리 AND 160
      • 논리 OR 160
      • 논리 부정 161
    • 조건 연산자 164
      • switch문 167
      • 무조건 분기 172
      • 의사결정과 유효 범위 173
      • 요약 175
      • 연습문제 176
  • 05장 루프: 여러 개의 문장을 반복 실행 177
    • 루프를 제대로 이해하기 177
    • while 루프 179
    • do-while 루프 182
      • 좀 더 복잡한 while 루프 조건식 185
    • for 루프 185
      • 루프와 변수 유효 범위 188
      • 실수 값으로 for 루프를 제어하기 190
      • 좀 더 복잡한 루프 제어식의 사용 195
    • 중첩 루프 199
    • 루프 조건 건너뛰기 204
    • 루프 벗어나기 207
      • 무한 루프 207
    • 요약 213
    • 연습문제 214
  • 06장 배열과 문자열 215
    • 배열 215
      • 배열을 사용하는 방법 216
      • 배열을 초기화하는 방법 221
      • 문자 배열 226
    • 다차원 배열 231
      • 다차원 배열을 초기화하는 방법 234
      • 다차원 문자 배열 237
    • 더 똑똑한 문자열: String 클래스 240
      • string 객체의 선언 241
      • string 객체로 할 수 있는 다양한 연산 243
      • string 내의 문자에 접근하는 방법 246
      • 부분 문자열에 접근하는 방법 249
      • 문자열 비교 250
      • 문자열 검색 258
      • 문자열의 내용을 수정하는 방법 268
    • string 타입의 배열 275
    • 와이드 문자 문자열 276
    • 요약 276
    • 연습문제 278
  • 07장 포인터 279
    • 포인터 279
    • 포인터를 선언하는 방법 280
      • 포인터를 사용하는 방법 281
    • 포인터 초기화 287
      • char 포인터의 초기화 288
    • 포인터 상수와 상수를 가리키는 포인터의 구별 300
    • 포인터와 배열 302
      • 포인터 연산 302
      • 배열 이름을 포인터 표기로 사용 305
      • 다차원 배열에 대해 포인터를 사용하는 방법 309
      • C 스타일 문자열에 대한 연산 313
    • 동적 메모리 할당 315
      • 자유 저장 공간 316
      • new와 delete 연산자 316
      • 배열을 동적 메모리 할당으로 생성하는 방법 317
      • 동적 메모리 할당의 함정 320
      • 포인터 변환 326
    • 요약 327
    • 연습문제 328
  • 08장 함수 329
    • 프로그램을 여러 조각으로 나누는 이유 329
      • 프로그램을 함수로 나눠 작성해야 하는 이유 331
    • 함수의 이해 331
      • 함수를 정의하는 방법 332
      • 함수 선언 338
    • 함수에 인수를 전달하는 방법 340
      • 값에 의한 전달 방식 341
      • 참조에 의한 전달 방식 352
      • main()에 전달되는 인수 357
    • 인수의 기본 값 359
      • 복수의 기본 매개변수 값 360
    • 함수로부터 값을 반환하기 363
      • 포인터 반환 364
      • 레퍼런스의 반환 368
      • 함수로부터 새로운 변수의 반환 369
    • 인라인 함수 369
    • 정적 변수 370
    • 요약 374
    • 연습문제 374
  • 09장 함수에 대한 더 많은 내용 377
    • 함수 오버로딩 377
      • 함수 시그내처 378
      • 오버로딩과 포인터 매개변수 381
      • 오버로딩과 레퍼런스 매개변수 381
      • 오버로딩과 const 매개변수 384
      • 함수 오버로딩 시 기본 인수 값의 사용 386
    • 함수를 찍어내는 소시지 기계 386
      • 함수 템플릿의 인스턴스 생성 388
      • 템플릿 매개변수를 명시적으로 지정하는 방법 391
      • 템플릿의 특수화 392
      • 함수 템플릿과 오버로딩 395
      • 복수 매개변수를 갖는 템플릿 396
    • 함수 포인터 398
      • 함수 포인터의 선언 399
      • 함수를 인수로서 전달 403
      • 함수 포인터의 배열 405
    • 재귀 406
      • 재귀 함수 사용 409
    • 요약 416
    • 연습문제 417
  • 10장 프로그램 파일과 전처리 지시어 419
    • 프로그램을 구성하는 파일들 419
      • 이름의 유효 범위 421
      • “1회 정의” 규칙 424
      • 프로그램 구성 파일의 연결 관계 424
      • 외부 이름 425
    • 네임스페이스 431
      • 전역 네임스페이스 432
      • 네임스페이스 정의 433
      • 함수와 네임스페이스 437
      • 함수 템플릿과 네임스페이스 441
      • 확장 네임스페이스 443
      • 무명 네임스페이스 447
      • 네임스페이스 앨리어스 448
      • 중첩 네임스페이스 448
    • 전처리 450
      • 헤더 파일의 포함 451
      • 프로그램 코드의 일부 대체 452
      • 매크로 대체 454
      • 여러 줄에 걸쳐 전처리 지시어를 사용하기 458
      • 매크로 인수로서의 문자열 458
      • 매크로 확장에서 인수들을 합치기 460
    • 논리 전처리 지시어 460
      • 논리 #if 지시어 461
      • 특정 값을 검사하는 지시어 464
      • 다중 선택 코드 464
      • 표준 전처리 매크로 466
      • #error와 #pragma 지시어 467
    • 디버깅 방법 467
      • 통합 디버거 468
      • 디버깅 과정에서 전처리 지시어의 역할 469
      • assert() 매크로 476
    • 요약 478
    • 연습문제 479
  • 11장 사용자 정의 데이터 타입 481
    • 객체 소개 481
    • C++의 구조체 483
      • 구조체의 개념 483
      • 구조체 타입을 정의하는 방법 484
      • 구조체 타입의 객체 생성 486
      • 구조체 객체의 멤버에 접근하는 방법 487
      • 구조체와 포인터의 병용 495
    • 공용체 500
      • 공용체 선언 501
      • 익명 공용체 503
    • 좀 더 복잡한 구조체 504
      • 구조체를 멤버로 갖는 구조체 506
    • 요약 512
    • 연습문제 513
  • 12장 클래스 기초 515
    • 클래스와 객체 지향 프로그래밍 515
      • 캡슐화 516
      • 상속 518
      • 다형성 519
      • 용어 521
    • 클래스 정의 521
    • 생성자 525
      • 생성자 정의를 클래스 외부에 두기 528
      • 기본 생성자 530
      • 기본 초기화 값 534
      • 생성자에서의 초기화 목록 사용 535
      • explicit 키워드의 사용법 535
    • 클래스의 private 멤버 537
      • private 클래스 멤버에 접근하는 방법 543
      • 기본 복사 생성자 544
    • 프렌드 546
      • 클래스의 프렌드 함수 546
      • 프렌드 클래스 550
    • this라는 이름의 포인터 550
    • const 객체와 const 멤버 함수 556
      • mutable 데이터 멤버 558
      • const 속성 변환 559
    • 객체의 배열 560
    • 클래스 객체의 크기 563
    • 클래스의 static 멤버 565
      • 클래스의 static 데이터 멤버 566
      • static 멤버 함수 572
    • 요약 573
    • 연습문제 575
  • 13장 클래스 고급 577
    • 클래스 객체에 대한 포인터와 레퍼런스 577
    • 데이터 멤버로서의 포인터 578
      • Package 클래스 정의 580
      • TruckLoad 클래스의 정의 583
      • TruckLoad 클래스 구현 584
    • 클래스에의 접근을 제어하는 방법 594
      • 중첩 클래스 595
    • 복사 생성자의 중요성 597
      • 복사 생성자 구현 598
    • 객체 내에 동적 메모리 할당 606
      • 소멸자 606
      • 소멸자 정의 607
      • 기본 소멸자 607
      • 소멸자 구현 610
    • 클래스 내의 레퍼런스 611
      • 클래스 멤버로서의 레퍼런스 611
    • 요약 614
    • 연습문제 615
  • 14장 연산자 오버로딩 617
    • 클래스를 위한 연산자 구현 617
      • 연산자 오버로딩 618
      • 오버로딩 가능한 연산자 618
      • 연산자 오버로딩의 구현 619
      • 전역 연산자 함수 624
      • 연산자 구현 수준의 향상 624
      • 연산자 함수 이디엄 628
      • 대입 연산자의 오버로딩 629
      • 산술 연산자의 오버로딩 638
      • 첨자 연산자의 오버로딩 644
      • 타입 변환 오버로딩 652
      • 증가 연산자와 감소 연산자 오버로딩 654
      • 스마트 포인터 655
      • new와 delete 연산자의 오버로딩 662
    • 요약 663
    • 연습문제 664
  • 15장 상속 667
    • 클래스와 객체 지향 프로그래밍 667
      • 계층 구조 668
    • 클래스의 상속 669
      • 상속과 집합 670
      • 파생 클래스를 만드는 방법 672
    • 상속이 일어날 때 멤버의 접근 제한 676
    • Protected 접근 지정자 679
    • 상속받은 멤버의 접근 수준 682
      • 클래스 계층 구조에서 접근 지정자 683
      • 상속된 멤버의 접근 지정자 변경 685
    • 파생 클래스에서 생성자의 동작 687
      • 파생 클래스에서 복사 생성자의 동작 691
    • 상속과 소멸자 695
      • 소멸자가 호출되는 순서 697
    • 멤버 이름이 중복될 때 698
      • 함수 멤버 이름의 중복 699
    • 다중 상속 700
      • 여러 개의 기초 클래스 700
      • 상속받은 멤버의 모호성 702
      • 반복 상속 708
      • 가상 기초 클래스 710
    • 관련된 클래스 타입 간의 변환 711
    • 요약 712
    • 연습문제 713
  • 16장 가상 함수와 다형성 715
    • 다형성에 대해서 715
      • 기초 클래스 포인터를 사용하기 716
      • 상속받은 함수의 호출 718
      • 가상 함수 722
      • 가상 함수의 기본 인수 값 731
      • 레퍼런스를 사용한 가상 함수 호출 735
      • 가상 함수의 기초 클래스 버전 호출 737
      • 클래스 객체 포인터 간의 변환 738
      • 동적 타입 변환 741
    • 다형성의 대가 743
    • 순수 가상 함수 745
      • 추상 클래스 746
      • 간접 추상 기초 클래스 749
    • 포인터를 통해 객체 소멸 753
      • 가상 소멸자 755
    • 프로그램 실행 중에 타입을 알아내는 방법 757
    • 클래스 멤버에 대한 포인터 758
      • 데이터 멤버에 대한 포인터 759
      • 멤버 함수에 대한 포인터 763
    • 요약 768
    • 연습문제 769
  • 17장 예외 처리 771
    • 에러 처리 771
    • 예외의 이해 772
      • 예외 발생 773
      • 예외 발생의 원인이 되는 코드 779
      • 중첩 try 블록 781
    • 예외로서의 클래스 객체 785
      • Catch 핸들러와 예외 타입 간 대조 787
      • 기초 클래스 핸들러로 파생 클래스 예외 포착 791
      • 예외를 다시 던짐 794
      • 모든 예외를 포착 798
    • 예외를 던지는 함수 800
      • 함수 try 블록 800
      • 생성자에서 예외 던짐 804
      • 예외와 소멸자 805
    • 표준 라이브러리 예외 805
      • 표준 라이브러리의 예외 클래스 806
      • 표준 예외의 사용 807
    • 요약 809
    • 연습문제 810
  • 18장 클래스 템플릿 811
    • 클래스 템플릿의 이해 811
      • 클래스 템플릿의 응용 분야 812
    • 클래스 템플릿을 정의하는 방법 813
      • 템플릿 매개변수 814
      • 간단한 클래스 템플릿 815
      • 클래스 템플릿의 인스턴스 생성 820
      • 클래스 템플릿의 정적 멤버 829
      • 클래스 템플릿의 타입 아닌 매개변수 830
      • 타입 아닌 매개변수 예제 831
      • 템플릿 인수의 기본 값 843
    • 명시적 템플릿 인스턴스 생성 844
    • 클래스 템플릿의 프렌드 844
    • 특수한 경우 846
      • 부분 특수화 847
    • 중첩 클래스가 있는 클래스 템플릿 849
      • 멤버 함수 템플릿 정의 851
    • 고급 클래스 템플릿 859
    • 요약 860
    • 연습문제 861
  • 19장 입출력 연산 863
    • C++에서의 입력과 출력 기능 863
      • 스트림의 이해 864
      • 스트림 사용의 이점 865
    • 스트림 클래스들 866
      • 표준 스트림 867
      • 스트림 삽입 및 추출 연산 868
      • 스트림 조작자 871
    • 파일 스트림 874
      • 파일에 기록 874
      • 파일에서 읽어 들이기 877
      • 파일 열기 모드 설정 880
    • 비형식화 스트림 연산 890
      • 비형식화 스트림 입력 891
      • 비형식화 스트림 객체 893
    • 스트림 입출력에서의 에러 894
      • 입출력 에러와 예외 895
    • 2진 모드 스트림 연산 896
      • 2진 형태로 수치 데이터 기록 900
    • 스트림에서 Read/Write 연산 906
      • 파일의 임의 접근 907
    • 문자열 스트림 915
    • 객체와 스트림 916
      • 클래스 객체에 삽입 연산자를 오버로딩하는 방법 917
      • 클래스 객체를 위한 추출 연산자 오버로딩 919
      • 스트림 내의 좀 더 복잡한 객체들 923
    • 요약 937
    • 연습문제 937
  • 20장 STL 소개 939
    • STL 아키텍처의 소개 939
      • STL의 구성 요소 940
      • STL 헤더 946
    • vector 컨테이너 947
      • vector 컨테이너 생성 947
      • vector의 요소에 접근하는 방법 951
      • vector 컨테이너 기본 연산 953
      • vector 컨테이너와 배열 연산의 함께 사용 959
      • 입력 스트림 반복자 964
    • 자신만의 반복자를 만드는 방법 968
      • 알고리즘에 반복자를 전달하는 방법 971
      • 반복자가 되기 위한 조건 974
      • STL 반복자의 멤버 함수이기 위한 조건 977
      • 삽입 반복자 982
    • 리스트 컨테이너 984
      • list 컨테이너의 생성 984
      • 리스트의 요소에 접근하는 방법 985
      • 리스트에 대해 가능한 연산 986
    • 연관 컨테이너 993
      • map 컨테이너 994
    • 성능과 특수화 1004
    • 요약 1006
    • 연습문제 1007
  • 부록 A ASCII 코드 1009
  • 부록 B C++ 키워드 1013
  • 부록 C 표준 라이브러리 헤더 1015
    • 언어 지원 1016
    • 입력/출력 1017
    • 진단 기능 1017
    • 일반 유틸리티 1018
    • 문자열 1018
    • 컨테이너 1019
    • 반복자 지원 1019
    • 범용 목적 알고리즘 1020
    • 수치 연산 1020
    • 지역화 1020
  • 부록 D 연산자 우선순위와 결합 순서 1021
  • 부록 E 2진수와 16진수의 이해 1025
    • 2진수 1025
    • 16진수 1027
    • 음의 2진수 1028
      • 빅 엔디언과 리틀 엔디언 시스템 1030
  • 부록 F 예제 프로젝트 1033
    • 개요 1033
      • 프로젝트 개선 작업 1035
    • 개발자의 노트 1035
      • Person 클래스 1036
      • Student와 Teacher 파생 클래스 1036
      • 컨테이너 1037

관련 블로그 글

C++를 제대로 배워봅시다!

사용자 삽입 이미지

비기닝 ANSI C++
부제: 완벽한 언어표준 기초부터 차근차근
Ivor Horton 지음 | 이정문 옮김 | 1,128쪽 | 40,000원
2008년 4월 30일 펴냄 | ISBN
9788989975762


세상에는 정말 많은 프로그래밍 언어가 있습니다. 언어를 배우는 일은 길고도 또한 험난한 과정입니다. 언어가 얼마나 전파되어 있느냐에 따라 다르지만 유명 프로그래밍 언어에 대해서는 수백 배에 달하는 책들이 쏟아져 나오기도 합니다. 어떤 책을 선택하느냐가 그 언어 습득을 좌우하는 일은 아니지만, 그래도 길잡이가 되어줄 만한 좋은 책을 찾는다는 것은 훌륭한 스승을 만나는 일처럼 중요합니다. 특히 무언가를 시작하는 시점이라면 더욱 중요하겠죠.

사용자 삽입 이미지
마치 형님 아우처럼 어깨를 나란히 한 두 책입니다. 간지가 줄줄 흐르는 표지가 멋지지 않나요? ㅎㅎ

저희 에이콘에서 출간된 프로그래밍 언어 가이드 서적은 많지 않습니다. 지난 2005년에 출간된 『비기닝 C: 기초부터 차근차근』이라는 책이 유일하다고 볼 수 있겠죠. 꽤 오랜 시간이 흐른 후에 C++ 언어 표준이라고 할 수 있을 ANSI C++에 대한 바이블 격인 입문서가 출간되었습니다.

사용자 삽입 이미지
옮긴이 이정문님이 역자서문에서도 말씀해주셨듯이 C++ 분야에서 가장 유명한 책이라면 C++의 창시자 비야네 스트로스트럽(Bjarne Stroustrup)이 직접 쓴『The C++ Programming Language』을 들 수 있을 것입니다. 권위나 명성, 내용에 있어 어디에도 비견할 수 없는 훌륭한 책이지요. 하지만 어느 정도 C++의 기초가 잡힌 뒤에 읽어야 완벽히 소화할 수 있을 내용도 많아서 초심자가 보기에 적당한 책도 필요했었습니다.

이 책은 독자 여러분이 과거에 어떤 프로그래밍을 해봤든 상관없이, 프로그래밍이 무엇인가에 관한 대략적인 개념만 있으면 읽을 수 있도록 충분한 예제와 테스트를 통해 "기초부터 차근차근" 배워볼 수 있도록 알뜰히 구성되어있습니다.
사용자 삽입 이미지
사진을 보시고 느끼셨겠지만 1,128페이지에 달하는 방대한 내용을 단번에 읽어내기는 쉬운 일은 아닐 것입니다. 하지만 어떤 언어보다 강력하고 폭넓은 기능을 제공하는 C++를 배우고자 하는 데 함께할 그 길고도 험난한 여정에 비기닝 ANSI C++가 함께 해드리겠습니다.

사용자 삽입 이미지
이 책은 또한 ANSI C++ 표준을 다루고 있습니다. C++ 표준안은 어떤 하드웨어나 운영체제 환경에서도 컴파일러 개발 시의 참조모델로 사용 될 수 있도록 정의된 것입니다. 또 어떤 개발 환경에서도 성능을 극대화하고 유연성을 확보할 수 있다는 뜻이기도 합니다. 이 책에서는 동일한 결과를 보여줘야 하는 책의 특성상 인텔 CPU를 기반한 PC에서 모든 예제를 실행했지만, 플랫폼 간 중요한 차이점에서도 설명하고 있습니다.

C++ 입문을 고려하는 초심자께 소중한 참고서적으로 평가 받길 바랍니다. 이 책은 오늘 따끈따끈하게 출간되어 교보문고, YES24, 강컴, 알라딘, 인터파크 등을 비롯한 서점들에서 구매하실 수 있습니다.

4월의 마지막날입니다. "벌써!"라고 탄성을 지를 분들 많으시죠? 하지만 오히려 그런 분들이야말로 올초에 세웠던 목표를 향해 열심히 달려오셨기 때문이 아닐까 싶습니다. 계절의 꽃이라는 5월, 행복과 사랑과 보람이 넘치는 따뜻한 시간을 만들어 가시기 바랄게요. :)

* 지금 미투데이 codian님이 애써주신 덕분에 태터툴즈 최신 버전으로 업그레이드한 텍스트 큐브 버전으로 글을 쓰고 있는데요. 몇 가지 향상된 기능들이 엿보이네요. 무엇보다 자동으로 저장해주고 있어서 든든하네요. ㅎㅎ 좋습니다! ^^/

CC

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

도서 오류 신고

도서 오류 신고

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

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

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

정오표

[ p7 두 번째 박스 아래로 4행 ]
C++에서 입력과 출력은 스트림(stream) → SC++에서 입력과 출력은 스트림(stream)

[ p14 박스 중앙 코드 ]
namespace mine
{
int test()
{
    if(isGood) {
        good();
        return 0;
    } else
        return 1;
}
}

namespace mine
{
int test()
{
    if(isGood)
    {
        good();
        return 0;
    } else
        return 1;
}
}

[ p25 두 번째 박스 4행 ]
<< \t\tsoonest mended.\"\a" → << "\t\tsoonest mended.\"\a"

[ p51 두 번째 박스 ]
int bean_count = 5; → short bean_count = 5;

[ p57 첫 번째 박스 7행 ]
scout << endl<< "Each child gets "<< fruit_per_child << " fruit.";
cout << endl<< "Each child gets "<< fruit_per_child << " fruit.";

[ p59 3행 ]
iranges의 값을 → oranges의 값을

[ p59 표 2-6 4행 ]
곱셈 | (공백) → 곱셈 | ·

[ p64 1행 아래 실행 결과 부분 ]
Enter a length as yards, feet, and inches: 2 2 11 Length in inches is 107

How It Works


Enter a length as yards, feet, and inches: 2 2 11

Length in inches is 107

[ p67 두 번째 박스 아래로 4행 ]
0x3fffffff → 0x7fffffff

[ p70 표 2-7 ]
-1.2345*103(즉, -1234.5) → -1.2345*103(즉, -1234.5)

[ p70 표 2-7 아래 2-7행 ]
표 2-7 아래로 3행 삭제
표 2-7 아래로 7행 삭제

[ p79 표 2-11 log(arg)와 log10(arg) 설명 부분 ]
arg는 어떤 실수 타입도 가능하다. → arg는 0이 아닌 양수 값이어야 한다.

[ p80 두 번째 박스 2행 ]
const float pi = 1.14159f; → const float pi = 3.14159f;

[ p81 두 번째 박스 ]
double toe_to_tip = distance*std::cos(angle);
→ double toe_to_tip = distance/std::cos(angle);

[ p95 아래에서 9-10행 ]
ins = static_cast<long>(yards * feet_per_yard * inches_per_foot)
→ ins = static_cast<long>(yards * feet_per_yard * inches_per_foot) % inches_per_foot;

[ p96 마지막 박스 ]
yds = static_cast (yards); → yds = static_cast<long>(yards);

[ p97 첫 번째 박스 ]
ft = static_cast ((yards - yds) * feet_per_yard);
→ ft - static_cast<long>((yards - yds) * feet_per_yard);

[ p115 출력 결과 중 6-7행 들여쓰기 ]
Bitwise AND red & white = 00ff0000
Bitwise OR red | white = 00ffffff

 Bitwise AND red & white = 00ff0000
 Bitwise OR red | white = 00ffffff

[ p120 아래에서 2행 ]
이런 수식은 리터, 열거자, const 등으로
→ 이런 수식은 리터, 열거자, const 등으로

[ p123 출력 결과 중 7-8행 들여쓰기 ]
Current language is 2
Current language is now 3

 Current language is 2
 Current language is now 3

[ p150 표 4-2 ispunct() 함수에 대한 설명 정정 ]
문자,숫자,공백 등을 제외한 인쇄 가능한 문자인 구두점인지 검사한다.구두점에는_{}
[ ] # ( ) < > % : ; . ? * +-/ ^ & | ~ ! = , \ " '등이 있다.

[ p174 박스 내 아래에서 7행 ]
// 실행 흐름 속에 있지만 그냥 지나치지 있음
→ // 실행 흐름 속에 있지만 그냥 지나치고 있음

[ p180 박스 내 아래에서 5행 ]
sum += i++ → sum += i++;

[ p183 실행 결과 마지막 행 ]
Average temperature is 65.5 → The average temperature is 65.5

[ p190 첫 번째 박스 ]
1행 삭제

[ p201 출력 결과 제일 위 한 행 추가 ]
What size table would you like (2 to 12)? 10

[ p247 프로그램 6.7 5-6행 ]
using std::cin;u
sing
std::endl;

using std::cin;
using std::endl;

[ p267 첫 번째 박스 1-2행 ]
string sentence = "Manners maketh man"
string word = "an"

string sentence = "Manners maketh man";
string word = "an";

[ p271 프로그램 6.11 4-5행 ]
using std::cin;u
sing
std::endl;

using std::cin;
using std::endl;

[ p272 박스 내 8행 ]
<< "Operation aborted." << cout;
→ << "Operation aborted." << endl;

[ p273 세 번째 박스 내 3행 ]
<< "Operation aborted." << cout;
→ << "Operation aborted." << endl;

[ p277 마지막 행 ]
wstring 타입의 객체는 wxhar_t 타입 문자로 → wstring 타입의 객체는 wchar_t 타입 문자로

[ p338 박스 아래로 1-2행 ]
컴파일러는 main() 함수를 처리할 때 아직 power() 함수가 정의돼 있다고 말하면서 컴파일을 거부한다.
→ 컴파일러는 main() 함수를 처리할 때 아직 power() 함수가 정의되지 않았다고 알려주면서 컴파일을 거부한다.

[ p351 프로그램 8.7 10행 ]
  {9.0, 10.0, 11.0, 12.0}
}

  {9.0, 10.0, 11.0, 12.0}
};

[ p361 프로그램 8.9 15행 ]
show_data(&dataItem, 1, "Unlucky for some!")
→ show_data(&dataItem, 1, "Unlucky for some!");

[ p365 프로그램 8.10 아래에서 7행 ]
int min → double min

[ p365 프로그램 8.10 아래에서 3행 ]
int max → double max

[ p367 마지막 박스 ]
int min → double min

[ p368 두 번째 박스 ]
int max → double max

[ p384 4번째 박스 내 마지막 행 ]
long num3 = *larger( num1, num2); → long num3 = *larger(&num1, &num2);

[ p384 마지막 박스 내 마지막 행 ]
const long num30 = *larger(num10, num20); → const long num30 = *larger(&num10, &num20);

[ p397 ● 항목 중 3행 ]
객체 타입을 가리키는 포인터나 레런스
→ 객체 타입을 가리키는 포인터나 레런스

[ p400 세 번째 박스 ]
long (*pfun)(long *, int) = max_element;
→ long (*pfun)(const long *, int) = max_element;

[ p404 프로그램 9.6 중 아래에서 8행 ]
cubed(double x) {return x*x*x;}
double cubed(double x) {return x*x*x;}

[ p407 Try it out 3행 ]
n이 0이면 결과 값은 0이다 → n이 0이면 결과 값은 1이다

[ p408 How it works 4행 ]
결국 0보다 큰 n에 대해 power() 함수는 n번 호출될 것이다
→ 결국 0보다 큰 n에 대해 power() 함수는 n+1번 호출될 것이다

[ p422 두 번째 박스 1-2행 ]
int main()
   const int limit = 10;

const int limit = 10;
int main()

[ p429 두 번째 박스 마지막 행 ]
} → };

[ p488 프로그램 11.1 9행 ]
} → };

[ p495 프로그램 11.1 9행 ]
Book pDictionary = new Book; → Book *pDictionary = new Book;

[ p497 프로그램 11.2 3행 ]
#define BOX_H struct Box {

#define BOX_H
struct Box {

[ p501 아래에서 6행 ]
lon 타입 변수와 → long 타입 변수와

[ p505 세 번째 박스 7, 9행 ]
} → };

[ p508 세 번째 박스 9행 ]
} → };

[ p510 프로그램 11.3 10행 ]
} → };

[ p539 첫 번째 박스 내 아래에서 2행 ]
} → };

[ p630 두 번째 박스 6행 ]
Data(const Data& aData) : Value(aData.value) {} // 복사 생성자
→ Data(const Data& aData) : value(aData.value) {} // 복사 생성자

[ p660 첫 번째 박스 아래로 1행 ]
pBox에 들어 있는 현재 주소의 복사본을 → pTemp에 들어 있는 현재 주소의 복사본을

[ p950 실행 결과 ]
size of 10 element array: 40
size of 10 element vector: 16
sum of 10 array elements: -8
sum of 10 vector elements: -8
sum of 10 new vector elements: -8

size of 10 element array: 40
size of 10 element vector: 20
sum of 10 array elements: 45
sum of 10 vector elements: 45
sum of 10 new vector elements: 45

[ p1029 아래에서 10행 ]
0000 0100에서 0000 0100를 빼면 결과는 1111 1000이다.
→ 0000 0100에서 0000 1100을 빼면 결과는 1111 1000이다.