Steady Seller

Programming: Principles and Practice Using C++ (Second Edition) 한국어판

  • 원서명Programming: Principles and Practice Using C++ (2nd Edition) (ISBN 9780321992789)
  • 지은이비야네 스트롭스트룹(Bjarne Stroustrup)
  • 옮긴이최광민
  • ISBN : 9788960777866
  • 60,000원
  • 2015년 11월 30일 펴냄
  • 페이퍼백 | 1,300쪽 | 188*255mm
  • 시리즈 : 프로그래밍 언어

책 소개

소스 코드 파일은 여기에서 내려 받으실 수 있습니다.
https://www.stroustrup.com/Programming/Solutions/exercise_solutions.html

요약

C++ 창시자가 전해주는 프로그래밍의 이상과 원리!
‘오래가는 프로그래머’, ‘존경받는 프로그래머’가 되고 싶다면 초보 프로그래머에서 익숙한 개발자까지 누구나 곁에 두고 읽어야 할 필독서다. 실용적인 예제를 바탕으로 C++의 기본적인 문법은 물론, 구조적 프로그래밍과 객체 지향 프로그래밍, 제네릭 프로그래밍을 비롯해 현대적인 프로그래밍 언어를 관통하는 프로그래밍 패러다임의 진수를 체득할 수 있다!

이 책에서 다루는 내용

실전 프로그래밍을 위한 준비 운동

소프트웨어 개발을 비롯한 기술적인 분야의 복잡한 프로그램을 작성할 수 있다!

기본적인 개념과 기법 완벽 마스터

기본적인 개념과 기법을 다른 입문서보다 심도 있게 다룸으로써 유용하고 정확하며, 유지 보수가 쉽고 효율적인 코드를 작성할 수 있다.

최신 C++(C++11과 C++14)를 이용한 프로그래밍

객체 지향 프로그래밍과 제네릭 프로그래밍을 비롯한 일반적인 프로그래밍 입문서이자, 전 세계의 소프트웨어에서 가장 널리 사용하는 언어 중 하나인 C++ 프로그래밍 언어의 기초를 확고히 다질 수 있다. 더불어 현대적인 C++ 프로그래밍 기법은 물론, C++ 표준 라이브러리와 프로그래밍을 쉽게 만들어 주는 C++11과 C++14의 기능을 체득한다.

초보자는 물론 새로운 무언가를 배우고자 하는 모두를 위한 책

프로그래밍 경험이 전혀 없는 사람을 고려해 설계한 책으로, 수년간 수천 명의 대학 신입생을 대상으로 그 효과가 입증됐으며, 자습용으로도 널리 사용되고 있다. 더 나아가 많은 실무자와 우수한 학생에게 고수의 비법을 전수함으로써 새로운 깨달음을 얻게 한다.

폭넓은 시야로 배우는 프로그래밍

책의 전반부에서는 광범위한 기본 개념과 설계 기법, 프로그래밍 기법, 언어의 기능, 라이브러리를 설명함으로써 입력과 출력, 계산, 간단한 그래픽을 이용한 프로그램을 작성할 수 있게 해준다. 책의 후반부에서는 특화된 주제(텍스트 처리와 출력, 계산, C 프로그래밍 언어 등)를 다루며, 풍부한 참고 자료를 제공한다. 소스코드를 비롯한 독자 지원은 저자의 홈페이지에서 찾을 수 있다.

이 책의 대상 독자

학생들에게 전하는 말
지금까지 우리가 텍사스 A&M 대학교에서 이 책으로 가르쳤던 1학년 학생의 60%가 예전에 프로그래밍을 했던 경험이 있었고, 나머지 40%는 태어나서 단 한 줄의 코드도 본 적이 없었다. 그래도 대부분의 학생들이 성공적으로 수업을 마쳤고, 여러분도 할 수 있으리라 믿는다.
이 책을 꼭 수업용 교재로 읽을 필요는 없으며, 자습용 교재로도 많이 쓰인다. 하지만 이 책으로 수업을 듣든 혼자 공부하든 상관없이 누군가와 함께 공부하길 바란다. 프로그래밍은 외롭게 혼자 하는 작업이 아니다. 대부분의 사람들은 같은 목표를 공유하는 그룹의 일원일 때 더 효율적으로 일하고, 더 빨리 배운다. 친구와 함께 배우고, 문제에 대해 토론하는 일은 단순한 잡담이 아니라, 우리를 진일보시키는 가장 효율적이고 즐거운 방법이다. 친구와 함께 일하려면 적어도 여러분의 생각을 명확하게 표현해야 하고, 이는 여러분이 얼마나 잘 이해하고 기억하는지를 시험할 수 있는 최고의 방법이다. 여러분 스스로 모든 모호한 점과 프로그래밍 환경의 문제를 해결해야 할 필요는 없지만, 설사 교사가 시키지 않더라도 실습문제를 건너 뛰거나 충분한 연습문제를 풀지 않음으로써 여러분 스스로를 속이지 말자. 다른 분야와 마찬가지로 프로그래밍을 익히려면 연습이 필요하다는 점을 명심하자. 코드를 직접 작성하지 않으면 이 책을 읽는 일은 그저 무의미한 이론 공부에 불과하다.

대부분의 학생들이 , 특히 사려가 깊은 학생일수록 이렇게 열심히 공부할 만한 가치가 있는지 의구심이 들 수 있다. 그럴 때는 잠시 쉬었다가 지금 이 ‘들어가며’를 다시 읽고, 1장(‘컴퓨터, 사람, 프로그래밍’)과 22장(‘프로그래밍의 이상과 역사’)을 살펴보자. 그 곳에서 내가 발견한 프로그래밍의 흥미로운 점과 프로그래밍을 바탕으로 세상에 긍정적인 공헌을 할 수 있다고 생각하는 이유를 밝힌다. 나의 교육 철학과 접근 방식이 궁금하다면 0장(‘독자에게 전하는 글’)을 참고하라.
이 책이 너무 두껍다고 겁먹지 말자. 이 책이 두꺼워진 주요 이유는 내가 학생들이 필요한 부분의 설명만 찾게 하기보다, 반복적으로 설명하고 예제를 추가하는 방식을 선호하기 때문이다. 두 번째 이유는 책의 뒤쪽 절반 정도는 임베디드 시스템 프로그래밍과 텍스트 분석, 수치 계산 등 여러분이 관심 있는 분야에 대해 찾아볼 수 있는 참고 자료나 추가 자료로 구성했기 때문이다.
마지막으로, 너무 성급하지 말라. 새롭고 가치 있는 기술을 배우는 일은 언제나 시간을 요하며, 그럴 만한 가치가 있는 법이다.

교사에게 전하는 말
이 책은 전형적인 컴퓨터 과학 101 수업(개론 수업) 교재가 아니라, 실제로 작동하는 소프트웨어를 개발하는 방법을 주로 다룬다. 따라서 보통 컴퓨터 과학 학생들이 배우는 내용(튜링 완전성(turing completeness), 상태 기계(state machine), 이산 수학(discrete mathmatics), 촘스키 그래머(Chomsky grammars) 등)을 다루지 않는다. 학생들이 유치원 때부터 컴퓨터를 다양한 곳에 활용해봤다는 가정하에 하드웨어(hardware)에 대해서도 설명하지 않는다. 컴퓨터 과학에 있어 가장 중요한 주제들도 되도록 언급하지 않는다. 이 책은 오직 프로그래밍(소프트웨어를 개발하는 방법)만을 다룬다. 따라서 전통적인 수업 과정에서 다루는 내용보다 좁은 주제에 집중한다. 컴퓨터 과학은 수업 한 번으로 배울 수 없으므로 여기서는 오직 한 가지, 프로그래밍을 잘 하는 데 집중할 것이다. 이 책을 컴퓨터 과학이나 컴퓨터 공학, 전자 공학(1학년 학생 중엔 전자 공학도가 많다), 정보 과학 등의 교과 과정에서 채택한다면 다른 수업과 겸해서 개론 수업의 일부로 활용하길 바란다.
0장(‘독자에게 전하는 글’)에서 나의 교육 철학과 일반적인 접근방식을 알 수 있는데, 학생들이 그러한 생각에 따라 공부할 수 있게 전해주기 바란다.

이 책의 구성

1부. '기본 다지기'에서는 C++ 언어를 이용한 프로그래밍의 기본 개념들과 기법을 살펴보고 코드 작성을 시작하는 데 필요한 라이브러리의 기능을 알아본다. 여기에는 타입 시스템(type system)과 산술 연산, 제어 구조, 오류 처리, 설계와 구현, 함수(function) 사용법, 사용자 정의 타입(user-defined type) 등을 다룬다.

2부. '입력과 출력'에서는 키보드와 파일로부터 문자나 숫자 입력을 받고, 그에 상응하는 출력을 모니터나 파일에 내보내는 방법을 설명한다. 그리고 수치 데이터와 텍스트, 기하학적 도형을 시각적으로 출력하고, 그래픽 사용자 인터페이스GUI를 바탕으로 입력을 받아들이는 방법을 살펴본다.

3부. '데이터와 알고리즘'에서는 C++ 표준 라이브러리에 포함된 컨테이너와 알고리즘 프레임 워크인 표준 템플릿 라이브러리(STL, Standard Template Library)에 초점을 맞춘다. 컨테이너(vector, list, map 등)의 사용법과 내부 구현 방식(포인터 활용, 배열, 동적 메모리, 예외, 템플릿)을 살펴본다. 그리고 표준 라이브러리의 알고리즘(sort, find, inner_product 등) 설계와 사용법을 보여준다.

4부. '시야 넓히기'에서는 프로그래밍의 이상과 역사, 여러 가지 응용 예(행렬 계산, 텍스트 조작, 테스트, 임베디드 시스템 프로그래밍 등)와 C 언어의 개요를 바탕으로 프로그래밍을 여러 각도에서 살펴본다.

부록에서는 C++ 언어 자체에 대한 요약과 표준 라이브러리의 기능, 통합 개발 환경(IDE, Integrated Development Environment)과 그래픽 사용자 인터페이스 라이브러리 사용법 등 수업 시간에 다루기 적절하지 않은 유용한 정보를 제공한다.

상세페이지

저자/역자 소개

지은이의 말

프로그래밍(programming)은 주어진 문제의 해법을 컴퓨터가 실행할 수 있는 형태로 표현하는 기술이다. 프로그래밍에서 가장 공들여야 할 부분이 바로 그 해답을 찾고 가다듬는 일이며, 이 해답을 프로그래밍하는 과정에서 문제를 더 명확히 이해할 수 있다.
이 책은 예전에 한 번도 프로그래밍을 해본 적이 없지만 프로그래밍을 열심히 배우려는 의지가 있는 사람을 위한 책으로, C++ 프로그래밍 언어를 이용해서 프로그래밍의 이론과 실전 기술을 이해할 수 있게 만들었다. 나는 여러분이 최신 기술을 이용해서 간단하고 실용적인 프로그래밍을 하는 데 충분한 지식과 경험을 얻을 수 있길 바란다. 그렇다면 그러한 목적을 달성하는 데 얼마나 많은 시간이 필요할까? (보통 난이도의 수업을 네 개 정도 수강한다면) 대학교 1학년 과정에서 한 학기 동안 진행하면 적당하다. 혼자 공부한다면 그보다는 오래 걸린다(아마도 14주 동안 매주 15시간 정도 학습).

석 달이란 시간이 짧지는 않지만 배워야 할 것이 많으며, 지금으로부터 한 시간쯤 후에는 첫 번째 프로그램을 간단히 작성해본다. 그리고 모든 학습은 점진적으로 진행한다. 각 장에서는 새롭고 유용한 개념을 소개하고, 실전에서 쓸 만한 예제를 바탕으로 개념을 설명한다. 학습을 진행하다 보면 컴퓨터가 여러분이 원하는 일을 수행할 수 있게 아이디어를 코드(code)로 표현하는 능력이 점차 향상될 것이다. 나는 절대로 ‘한 달 동안 이론을 공부한 후에 여러분이 이론을 활용할 수 있는지 시험’해보는 방식으로 가르치지 않는다.

이쯤에서 궁금한 점이 있다. 여러분은 왜 프로그래밍을 배우려 하는가? 우리의 문명은 소프트웨어(software)를 기반으로 유지된다. 소프트웨어를 이해하지 못하면 여러분은 ‘마법’을 믿는 수준에서 벗어날 수 없고, 가장 흥미롭고 유익하고 사회적으로 유용한 기술 분야를 접할 수도 없다. 그래서 나는 프로그래밍에 대해 말할 때 매우 광범위한 분야를 논한다. 그래픽 사용자 인터페이스(GUI, Graphical User Interfaces)를 탑재한 개인용 컴퓨터에서부터 공학적인 수치 계산, (디지털 카메라와 자동차, 휴대폰 등에 들어가는) 임베디드 시스템(embedded system) 제어 응용 프로그램, 텍스트 편집기에 이르기까지 인간 생활의 많은 부분과 사업적인 응용 분야에서 그 예를 볼 수 있다. 그리고 수학과 마찬가지로 프로그래밍도 잘 갈고 닦으면 인간의 사고력 배양에 도움을 주는 값진 지적 활동이 될 수 있다. 다행히도 프로그래밍은 컴퓨터가 주는 피드백(feedback) 덕분에 대부분의 수학보다 손에 잡히는 무언가로서, 더 많은 사람이 수학보다 쉽게 접근할 수 있다. 여러분은 프로그래밍을 바탕으로 세상의 경계를 넓히고, 바라건대 더 좋은 방향으로 세상을 변화시킬 수 있다. 마지막 이유를 들자면 프로그래밍은 매우 즐거운 일이기도 하다.

그렇다면 왜 C++인가? 프로그래밍 언어 없이는 프로그래밍을 배울 수 없고, C++는 실세계의 소프트웨어에서 활용하는 주요 개념과 기법을 모두 지원하기 때문이다. 그리고 C++는 가장 널리 쓰이는 프로그래밍 언어 중의 하나로, 거의 모든 분야에서 활용하고 있다. 깊은 바다 밑바닥부터 화성 표면에 이르기까지, 어디서나 C++ 응용 프로그램을 찾아볼 수 있다. C++는 비영리 국제 표준화 단체에서 정교하고 포괄적으로 정의됐고, 어떤 종류의 컴퓨터에서나 그 종류에 맞는 고품질의 무료 구현체(implementations)를 구할 수 있다. C++로 배우는 대부분의 프로그래밍 개념은 C와 C#, 포트란(Fortran), 자바(Java) 등의 언어에서도 적용할 수 있다. 마지막 이유는 내가 우아하고 효율적인 코드를 작성할 때 가장 선호하는 언어가 바로 C++이기 때문이다.

하지만 이 책이 가장 쉬운 프로그래밍 입문서가 아니라는 점을 알아두자. 애초에 그렇게 만들 생각도 없었다. 나는 여러분이 실전 프로그래밍의 기본을 다질 수 있기를 바랄 뿐이다. 근래의 소프트웨어는 불과 몇 년 전에 나온 신기술을 바탕으로 한다는 점에서 그마저도 쉬운 목표는 아니다.

나는 기본적으로 여러분의 목적이 프로 정신을 바탕으로 책임감 있게 다른 사람들에게 유용한 고품질의 시스템을 만드는 데 있다고 가정한다. 따라서 나는 가르치고 배우기 쉬운 주제보다 실전 프로그래밍을 시작하는 데 필요한 주제를 다룬다. 이러한 주제를 다룰 때는 먼저 그 주제에 대해 설명하고, 개념을 예시하고, 해당 기술을 구현할 때 필요한 언어의 기능을 살펴본 후 제공된 연습문제를 푸는 순서로 진행한다. 여러분이 그저 장난감 프로그램을 이해하는 정도에서 만족한다면 내가 전달하려고 하는 내용보다 훨씬 적은 지식만 습득하게 된다. 그렇다고 해서 별로 실용성 없는 내용으로 여러분의 시간을 빼앗지는 않겠다. 이 책에서 어떤 주제를 다룬다면 그 주제가 여러분에게 필요하기 때문이다.

하지만 여러분이 다른 사람의 코드를 제대로 이해하지 않고 그대로 가져다 쓰거나, 스스로 많은 코드를 추가할 생각이 없다면 굳이 이 책을 볼 필요는 없다. 그렇다면 다른 책을 보거나 다른 언어를 사용하라. 여러분이 생각하는 프로그래밍이 그런 것이라면 왜 그런 생각을 하게 됐고, 그런 생각이 여러분의 필요를 충족할 수 있는지 다시 한 번 생각해보자. 사람들은 프로그래밍의 가치와 복잡성을 과소평가하는 경향이 있다. 물론 내가 설명하는 측면의 소프트웨어와 여러분이 필요한 것의 괴리로 인해 여러분이 프로그래밍을 싫어하지는 말았으면 한다. 정보 기술(Information technology)의 세계에는 프로그래밍 지식을 요구하지 않는 분야도 많다. 이 책은 단지 제대로 된 프로그램을 만들거나 분석하고 싶은 사람들을 위한 책이다.

이 책의 구성과 실용적인 목적으로 보자면 이미 C++를 조금 알고 있는 사람이나 다른 언어를 알고 있는 상태에서 C++를 배우려는 사람이 참고서로 사용할 수도 있다. 여러분이 이 두 가지 경우 중 하나에 속한다면 책을 다 읽는 데 얼마나 시간이 걸릴지는 모르겠지만 되도록 많은 연습문제를 풀기 바란다. 이를 바탕으로 오래되고 익숙한 스타일로 프로그래밍할 때 생기는 일반적인 문제를 더 적합한 최신 기술로 해결할 수 있다. 지금까지 예전 방식으로 C++를 배웠다면 7장에 다다르기 전에 놀랍고 유용한 무언가를 발견할 것이다. 여러분의 이름이 스트롭스트룹이 아닌 이상, 여기서 설명하는 C++는 여러분이 알고 있던 C++가 아닐 테니까.

프로그래밍을 배우려면 프로그램을 직접 작성해야 한다. 이런 점에서 프로그래밍은 실용적인 요소를 포함한 종목과 비슷하다. 예를 들어 수영과 악기 연주, 자동차 운전은 연습을 하지 않고 책만 읽어서는 배울 수 없다. 마찬가지로 많은 코드를 직접 읽고 작성하지 않으면 프로그래밍을 배울 수 없다. 따라서 이 책에서는 설명하는 내용이나 도식과 밀접하게 관련된 예제 코드를 중점적으로 다룬다. 이를 바탕으로 프로그래밍의 이상과 개념, 이론을 이해하고 이를 표현하는 데 필요한 언어적 구성 요소를 익힌다. 하지만 이러한 이해가 필수적이라고해도 그것만으로는 실용적인 프로그래밍 기술을 얻을 수 없다. 즉, 연습문제를 풀어봄으로써 코드를 작성하고 컴파일(compile)하고 실행하는 도구에 익숙해져야 한다. 프로그래밍 학습에 있어 코드 작성 말고는 도리가 없다. 게다가 코딩은 즐거운 일이잖은가!

물론 코딩이 프로그래밍의 전부는 아니다. 프로그래밍은 몇 가지 규칙을 따르고 매뉴얼을 읽는 일보다 훨씬 많은 일을 포함한다. 단언컨대 이 책은 C++ 문법에 국한되지 않는다. 프로그래밍의 기본적인 이상과 이론, 기술에 대한 이해가 좋은 프로그래머(programmer)의 자질이기 때문이다. 이런 프로그래머가 잘 설계된 코드를 작성하지 않으면 정확하고 견고하고 관리하기 쉬운 시스템(system)은 있을 수 없다. 그리고 이런 기본이야 말로 영원한 법이다. 오늘날 사용하는 언어와 도구가 진화하거나 대체돼도 기본은 여전히 기본이다.

그렇다면 컴퓨터 과학(computer science)과 소프트웨어 공학(software engineering), 정보 기술은 무엇일까? 모두 다 프로그래밍을 말하는가? 물론 아니다. 프로그래밍은 컴퓨터에 관련된 모든 분야의 기저에 깔린 기초적인 주제이며, 균형 잡힌 컴퓨터 과학 학습 과정의 일부다. 앞으로 알고리즘(algorithm)과 자료 구조(data structure), 사용자 인터페이스(user interface), 데이터 처리, 소프트웨어 공학의 주요 개념과 기술을 설명하겠지만, 이 책이 각 분야의 철저하고 균형잡힌 학습을 대체할 수는 없다.

코드는 아름답고 유용해질 수 있다. 이 책의 목적은 여러분이 그러한 사실을 실감하게하는 데 있다. 코드가 아름답다는 말의 의미를 깨닫고, 아름다운 코드를 만드는 데 필요한 이론과 실전 기술을 익히는 데 있다. 여러분의 프로그래밍에 행운이 함께 하기를!

지은이 소개

비야네 스트롭스트룹(Bjarne Stroustrup)

C++ 프로그래밍 언어를 설계하고 초기 구현체를 만들었으며, 『The C++ Programming Language, Fourth Edition』(에이콘출판, 2015년 근간)의 저자다. 모건 스탠리에서 기술부서 이사로 재직 중이며, 컬럼비아 대학교 컴퓨터공학과의 객원교수이자 텍사스 A&M 대학교 컴퓨터공학과의 연구 특임교수이며, 미국 공학회의 일원이다. 학계에서 일하기 전에는 AT&T 벨연구소에서 수십 년간 재직했다. ISO C++ 표준 위원회의 창립 멤버이기도 하다.

옮긴이의 말

‘재즈’를 소재로 다룬 영화로는 공전의 히트를 기록한 영화 <위플래쉬>의 주인공 앤드류는 세계 최고의 드러머가 되는 꿈에 모든 것을 바칩니다. 그러나 영화 내내 앤드류가 한 일이라고는 딱 한 가지, 단 한 번의 ‘더블 타임 스윙’을 완성하기 위해 똑같은 리듬을 수도 없이 반복해서 연습하는 일뿐입니다. 오랫동안 사랑했던 여인마저 버릴 정도로, 손에서 피가 흘러 더 이상 움직일 수 없을 정도로 그는 ‘연습’에 천착합니다.

사람마다 이 영화를 보며 느끼는 점이야 다르겠지만, 저는 ‘기본기’의 중요성을 새삼 되새기게 됐습니다. 그것이 운동이든, 학문이든, 사람 사이의 관계든 모든 분야를 관통하는 하나의 화두는 역시 ‘기본기’가 아닐까요? 프로그래밍도 마찬가지라고 생각합니다. 응용 분야가 무엇이든, 사용하는 언어가 무엇이든, 모든 것을 관통하는 기본기야말로 ‘오래가는 프로그래머’, ‘존경받는 프로그래머’가 되는 지름길입니다.

그렇다면 프로그래밍의 기본기는 무엇일까요? 저자가 책에서 여러 번 강조하듯이 ‘프로그래밍은 우리의 생각을 컴퓨터가 해석할 수 있는 언어로 명확하고 효과적으로 표현하는 일'이라고 할 수 있습니다. 결국 프로그래밍에 있어 중요한 점은 어떤 언어를 사용하느냐가 아니라 아이디어를 ‘어떻게’ 표현하느냐 하는 점입니다.

하지만 ‘기본기’라는 관점에서 프로그래밍을 조명하는 책은 시중에서 찾아보기 어렵습니다. 특히 궁극의 무림 고수에게 ‘기본기’를 전수받는 기회는 흔치 않습니다. 다행히도 이 책의 저자 비야네 스트롭스트룹은 여러분에게 탄탄한 기본기를 전수해줄 수 있는 고수 중의 고수입니다. 그냥 고수가 아니라 전 세계에서 가장 널리 쓰이는 언어인 C++를 창시한 궁극의 고수입니다. 우리는 이 책에서 저자가 수십 년 동안 쌓아온 기본기를 엿볼 수 있습니다.

여기서 말하는 기본기란 여타 프로그래밍 서적에서 쉽게 볼 수 있는 C++의 문법이 아닙니다. 단순한 언어 차원의 문법을 뛰어넘는, 구조적 프로그래밍과 객체 지향 프로그래밍, 제네릭 프로그래밍을 비롯한 현대적인 프로그래밍 언어를 관통하는 프로그래밍 패러다임의 진수를 체득할 수 있습니다. 그리고 이를 바탕으로 아이디어를 명확히 반영하는 코드, 유지 보수가 쉬운 코드, 성능 측면의 효율성을 갖춘 코드, 버그가 없는 정확한 코드를 작성하는 방법과 더 나아가 코드를 검증하고 테스트하는 방법을 설명합니다.

그렇다고 이 책이 고리타분한 이론서는 아닙니다. ‘구슬이 서말이라도 꿰어야 보배’라는 말처럼 아무리 멋진 이론이라도 현실에 적용하지 못하면 공허한 말장난일 뿐입니다. 이 책은 이론적인 설명과 더불어 실용적인 예제를 바탕으로 배운 내용을 충분히 연습하고 적용할 수 있는 기회를 제공합니다. 더불어 새로운 C++ 표준인 C++11과 C++14에 대한 내용도 폭넓게 다루고 있기에, 이미 프로그래밍에 익숙한 개발자라도 미처 알지 못했던 기본기나 기법을 발견하게 될 것입니다. 부디 이 책이 이제 막 프로그래밍을 시작하는 초심자는 물론, 프로그래밍에 익숙한 개발자 모두에게 이상적인 소프트웨어 개발을 향한 나침반이 되기를 바랍니다.

옮긴이 소개

최광민

한양대학교 컴퓨터 전공을 마치고, 현재 삼성SDS 연구소에 책임 연구원으로 재직 중이다. 회사에서든 일상에서든 새롭고 흥미로운 기술이라면 무엇이든 배우고 즐길 준비가 돼 있으며, 백발노인이 돼서도 끝없이 탐구하고 창조하는 사람이 되는 것을 인생의 목표로 삼고 있다. 옮긴 책으로는 에이콘출판사에서 출간한 『Chef, 클라우드 서비스 설정관리 자동화 도구』(2015)와 『JavaScript Testing』(2014), 『WordPress: The Missing Manual 워드프레스 사용자 가이드』(2014)가 있다.

목차

목차
  • 0장 독자에게 전하는 글
  • 0.1 이 책의 구성
  • 0.2 나의 교육 철학
  • 0.3 프로그래밍과 컴퓨터 과학
  • 0.4 창의성과 문제 해결
  • 0.5 독자 의견
  • 0.6 참고 자료
  • 0.7 지은이 소개

  • 1장 컴퓨터, 사람, 프로그래밍
  • 1.1 소개
  • 1.2 소프트웨어
  • 1.3 사람
  • 1.4 컴퓨터 과학
  • 1.5 컴퓨터의 광범위한 쓰임새
  • 1.6 프로그래머의 이상


  • 1부 기본 다지기
  • 2장 Hello, World!
  • 2.1 프로그램
  • 2.2 고전적인 첫 번째 프로그램
  • 2.3 컴파일 과정
  • 2.4 링크 과정
  • 2.5 프로그래밍 환경

  • 3장 객체, 타입, 값
  • 3.1 입력
  • 3.2 변수
  • 3.3 입력과 타입
  • 3.4 연산과 연산자
  • 3.5 대입과 초기화
  • 3.6 복합 대입 연산자
  • 3.7 이름
  • 3.8 타입과 객체
  • 3.9 타입 안전성

  • 4장 계산
  • 4.1 계산
  • 4.2 목적과 도구
  • 4.3 표현식
  • 4.4 구문
  • 4.5 함수
  • 4.6 vector
  • 4.7 언어 기능

  • 5장 오류
  • 5.1 소개
  • 5.2 오류의 원인
  • 5.3 컴파일 시간 오류
  • 5.4 링크 시간 오류
  • 5.5 실행 시간 오류
  • 5.6 예외
  • 5.7 논리 오류
  • 5.8 평가
  • 5.9 디버깅
  • 5.10 사전 조건과 사후 조건
  • 5.11 테스팅

  • 6장 프로그램 작성
  • 6.1 문제
  • 6.2 문제 고찰
  • 6.3 계산기로 복귀!
  • 6.4 문법
  • 6.5 문법에서 코드로
  • 6.6 첫 번째 버전 시도
  • 6.7 두 번째 버전 시도
  • 6.8 토큰 스트림
  • 6.9 프로그램 구조

  • 7장 프로그램 완성
  • 7.1 소개
  • 7.2 입력과 출력
  • 7.3 오류 처리
  • 7.4 음수
  • 7.5 나머지: %
  • 7.6 코드 정리
  • 7.7 오류 복구
  • 7.8 변수

  • 8장 언어적 세부 사항: 함수 등
  • 8.1 언어의 기술적 세부 사항
  • 8.2 선언과 정의
  • 8.3 헤더 파일
  • 8.4 유효 범위
  • 8.5 함수 호출과 반환
  • 8.6 평가 순서
  • 8.7 네임스페이스

  • 9장 언어적 세부 사항: 클래스 등
  • 9.1 사용자 정의 타입
  • 9.2 클래스와 멤버
  • 9.3 인터페이스와 구현
  • 9.4 클래스로의 진화
  • 9.5 열거형
  • 9.6 연산자 오버로딩
  • 9.7 클래스 인터페이스
  • 9.8 Date 클래스


  • 2부 입력과 출력
  • 10장 입출력 스트림
  • 10.1 입력과 출력
  • 10.2 입출력 스트림 모델
  • 10.3 파일
  • 10.4 파일 열기
  • 10.5 파일 읽고 쓰기
  • 10.6 입출력 오류 처리
  • 10.7 값 한 개 읽기
  • 10.8 사용자 정의 출력 연산자
  • 10.9 사용자 정의 입력 연산자
  • 10.10 표준 입력 루프
  • 10.11 구조화된 파일 읽기

  • 11장 입출력 맞춤화
  • 11.1 정규성과 비정규성
  • 11.2 출력 형식화
  • 11.3 파일 열기와 위치 지정
  • 11.4 문자열 스트림
  • 11.5 행 지향 입력
  • 11.6 문자 분류
  • 11.7 비표준 구분자 사용
  • 11.8 기타 훨씬 더 많은 것

  • 12장 디스플레이 모델
  • 12.1 왜 그래픽스인가?
  • 12.2 디스플레이 모델
  • 12.3 첫 번째 예제
  • 12.4 GUI 라이브러리 사용
  • 12.5 좌표
  • 12.6 도형
  • 12.7 Shape 사용
  • 12.8 프로그램 실행

  • 13장 그래픽스 클래스
  • 13.1 그래픽스 클래스의 개요
  • 13.2 Point와 Line
  • 13.3 Lines
  • 13.4 Color
  • 13.5 Line_style
  • 13.6 Open_polyline
  • 13.7 Closed_polyline
  • 13.8 Polygon
  • 13.9 Rectangle
  • 13.10 명명하지 않은 객체 관리
  • 13.11 Text
  • 13.12 Circle
  • 13.13 Ellipse
  • 13.14 Marked_polyline
  • 13.15 Marks
  • 13.16 Mark
  • 13.17 Image

  • 14장 그래픽스 클래스 설계
  • 14.1 설계 원칙
  • 14.2 Shape
  • 14.3 기반 클래스와 파생 클래스
  • 14.4 객체 지향 프로그래밍의 이점

  • 15장 함수와 데이터의 그래프 그리기
  • 15.1 소개
  • 15.2 간단한 함수의 그래프 그리기
  • 15.3 Function
  • 15.4 Axis
  • 15.5 근사치
  • 15.6 데이터의 그래프 그리기

  • 16장 그래픽 사용자 인터페이스
  • 16.1 사용자 인터페이스 방식
  • 16.2 Next 버튼
  • 16.3 간단한 윈도우
  • 16.4 Button과 기타 Widget
  • 16.5 예제
  • 16.6 제어 반전
  • 16.7 메뉴 추가
  • 16.8 GUI 코드 디버깅


  • 3부 데이터와 알고리즘
  • 17장 벡터와 자유 저장 영역
  • 17.1 소개
  • 17.2 벡터의 기본
  • 17.3 메모리와 주소, 포인터
  • 17.4 자유 저장 영역과 포인터
  • 17.5 소멸자
  • 17.6 요소에 접근
  • 17.7 클래스 객체를 가리키는 포인터
  • 17.8 타입 다루기: void*와 캐스트
  • 17.9 포인터와 참조
  • 17.10 this 포인터

  • 18장 벡터와 배열
  • 18.1 소개
  • 18.2 초기화
  • 18.3 복사
  • 18.4 필수적인 연산
  • 18.5 vector 요소에 접근
  • 18.6 배열
  • 18.7 예제: 회문

  • 19장 벡터, 템플릿, 예외
  • 19.1 문제 정의
  • 19.2 크기 변경
  • 19.3 템플릿
  • 19.4 구간 검사와 예외
  • 19.5 자원과 예외

  • 20장 컨테이너와 반복자
  • 20.1 데이터 저장과 처리
  • 20.2 STL의 이상
  • 20.3 시퀀스와 반복자
  • 20.4 연결 리스트
  • 20.5 다시 보는 vector 일반화
  • 20.6 예제: 간단한 텍스트 편집기
  • 20.7 vector와 list, string
  • 20.8 우리가 만든 vector를 STL에 비슷하게 만들기
  • 20.9 내장형 배열을 STL에 접목
  • 20.10 컨테이너 요약

  • 21장 알고리즘과 맵
  • 21.1 표준 라이브러리 알고리즘
  • 21.2 가장 간단한 알고리즘: find()
  • 21.3 범용적인 검색 : find_if()
  • 21.4 함수 객체
  • 21.5 수치 알고리즘
  • 21.6 연관 컨테이너
  • 21.7 복사
  • 21.8 정렬과 검색
  • 21.9 컨테이너 알고리즘


  • 4부 시야 넓히기
  • 22장 프로그래밍의 이상과 역사
  • 22.1 역사와 이상, 프로 정신
  • 22.2 간략히 살펴보는 프로그래밍 언어의 역사

  • 23장 텍스트 조작
  • 23.1 텍스트
  • 23.2 문자열
  • 23.3 입출력 스트림
  • 23.4 맵
  • 23.5 문제 제기
  • 23.6 정규 표현식
  • 23.7 정규 표현식을 이용한 검색
  • 23.8 정규 표현식 문법
  • 23.9 정규 표현식 매칭
  • 23.10 참고 자료

  • 24장 수치 계산
  • 24.1 소개
  • 24.2 크기와 정밀도, 오버플로
  • 24.3 배열
  • 24.4 C 스타일 다차원 배열
  • 24.5 Matrix 라이브러리
  • 24.6 예제: 선형 방정식 풀기
  • 24.7 난수
  • 24.8 표준 수학 함수
  • 24.9 복소수
  • 24.10 참고 자료

  • 25장 임베디드 시스템 프로그래밍
  • 25.1 임베디드 시스템
  • 25.2 기본적인 개념
  • 25.3 메모리 관리
  • 25.4 주소와 포인터, 배열
  • 25.5 비트, 바이트, 워드
  • 25.6 코딩 표준

  • 26장 테스팅
  • 26.1 우리의 목적
  • 26.2 증명
  • 26.3 테스팅
  • 26.4 테스팅을 쉽게 해주는 설계
  • 26.5 디버깅
  • 26.6 성능
  • 26.7 참고 자료

  • 27장 C 프로그래밍 언어
  • 27.1 C와 C++: 형제 사이
  • 27.2 함수
  • 27.3 기타 사소한 차이점
  • 27.4 자유 저장 영역
  • 27.5 C 스타일 문자열
  • 27.6 입력과 출력: stdio
  • 27.7 상수와 매크로
  • 27.8 매크로
  • 27.9 예제: 침습적 컨테이너

  • 5부 부록
  • 부록 A 언어 요약
  • A.1 일반적인 내용
  • A.2 리터럴
  • A.3 식별자
  • A.4 유효 범위와 저장 영역의 유형, 수명
  • A.5 표현식
  • A.6 구문
  • A.7 선언
  • A.8 내장형 타입
  • A.9 함수
  • A.10 사용자 정의 타입
  • A.11 열거형
  • A.12 클래스
  • A.13 템플릿
  • A.14 예외
  • A.15 네임스페이스
  • A.16 별칭
  • A.17 전처리기 지시어

  • 부록 B 표준 라이브러리 요약
  • B.1 개요
  • B.2 오류 처리
  • B.3 반복자
  • B.4 컨테이너
  • B.5 알고리즘
  • B.6 STL 유틸리티
  • B.7 입출력 스트림
  • B.8 문자열 조정자
  • B.9 수치
  • B.10 시간
  • B.11 C 표준 라이브러리 함수
  • B.12 기타 라이브러리

  • 부록 C 비주얼 스튜디오 시작
  • C.1 프로그램 실행
  • C.2 비주얼 스튜디오 설치
  • C.3 프로그램 작성과 시작

  • 부록 D FLTK 설치
  • D.1 소개
  • D.2 FLTK 다운로드
  • D.3 FLTK 설치
  • D.4 비주얼 스튜디오에서 FLTK 사용
  • D.5 테스트

  • 부록 E GUI 구현
  • E.1 콜백 구현
  • E.2 Widget 구현
  • E.3 Window 구현
  • E.4 Vector_ref
  • E.5 예제: Widget 조작

도서 오류 신고

도서 오류 신고

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

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

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

정오표

정오표

[p.36: 아래에서 3행]
http://www.acornpub.co.kr/book/programming-bjarne
->
http://www.acornpub.co.kr/book/programming-cplus

[p. 79: 아래에서 11행]
>>는 “cout에 출력하라”는 의미로
->
<<는 “cout에 출력하라”는 의미로

[p. 80: 아래에서 7행]
cout과 출력 연산자인 >>를 사용한다.
->
cout과 출력 연산자인 <<를 사용한다.

[p. 94: 일괄 변경]

->
이름

[p.102: 아래에서 2행]
int a - 3;
->
int a = 3;

[p.113 : 18행]
cout << <>
cout << c << ' ' << i1 << ' ' << c2 << '\n';

[p.117: 첫 행]
int char b1 {1000};
->
char b1 {1000};

[p.131: 표 제외 아래에서 3행]
지금까지 가장 간당한
->
지금까지 가장 간단한

[p.179: 아래에서 7행]
// 잘못된 인자인 경우 'b' 반환
->
// 잘못된 인자인 경우 '-1' 반환

[p.180: 아래에서 1행]
잠정만을
->
장점만을

[p.189 : 위에서 4행]
for (int x : temps)
->
for (double x : temps)

[p.219 : 아래에서 2행]
t2.value = 3.14;^
->
t2.value = 3.14;

[p.226 : 위에서 5행]
Term 그 자체다.
->
Expression 그 자체다.

[p.249: 2행]
case '(': case ')': case '+': case '– ': case '': case '/':
->
case '(': case ')': case '+': case '–': case '
': case '/':
('- '에서 - 뒤의 공백 삭제)

[p.254 : 아래에서 9행]
그리는 !는
->
그리고 !는

[p.266: 15행]
case '– ':
->
case '–':

[p.268: 13행]
case '– ':
->
case '–':

[p.308 : 1행]
(형식을 선택할 수 있는 기능도 제동한다.)
->
(형식을 선택할 수 있는 기능도 제공한다.)

[p.312: 5행]
집작
->
집착

[p.318 : 6행]
"아주 작다"는 말은
->
"매우 작다"는 말은

[p.333 : 실습문제 1행]
use.cpp에는 my.h와 stdlibfacilities.h를 #include 한다.
->
use.cpp에는 my.h를 #include 한다.

[p.333 : 실습문제 8행 - 하단 역자주]
my.h에서는 foo를 정의하지 않고 선언하기만 했으므로, 변수 foo를 사용하려면 my.cpp나 main.cpp 중의 한 곳에서 int foo = 0; 과 같이 foo를 정의해야 한다. 물론 foo를 전역 이름공간에서 선언했으므로 정의도 전역 이름공간에서 해야 한다.

[p.334 : 4행]
예상 밖의 결과라면 8.6절을 확인하자.
->
예상 밖의 결과라면 8.5.6절을 확인하자.

[p.340 : 7행]
Sahpe
->
Shape

[p.348 : 5행]
9.44절에서
->
9.4.4절에서

[p.358 : 1행]
Month m = Sep;
->
Month m = Month::Sep;

[p.372 : 13, 14행]

[p.397 : 15행]
if (isdigit(ch) || ch=="-") {
->
if(isdigit(ch) || ch=='-') {

[p.431 : 아래에서 8행]
"1.34e- 3"
->
"1.34e-3"

[p.439 : 위에서 13행]
// 필요한 문자 취환 수행
->
// 필요한 문자 치환 수행

[p.458 : 아래에서 1행]
각춘
->
갖춘

[p. 488 : 9행]
void Lines::Lines(initializerlist> lst)
-> Lines::Lines(initializer
list> lst)

[p.514 : 아래에서 8행]

[p.671 : 18행]
arg.elem.sz
->
arg.elem+sz

[p.673 : 위에서 13행]
a.elem.sz
->
a.elem+sz

[p.678 : 위에서 6행]
fill(cin)
->
fill2(cin);

[p.690]

[p.720: 아래에서 3행]
템플릿 사용자의 못은 아니다.
->
템플릿 사용자의 몫은 아니다.

[p.787 : 아래에서 13행]
p가 여전히 4의 값을 갖는 요소를 가리킨다는 점에 주목하자.
->
q가 여전히 4의 값을 갖는 요소를 가리킨다는 점에 주목하자.

[p.802 : 아래에서 6행]
기본적으로 항등 비교는 ==를, 순서 비교는 >(~보다 작다)을 이용해서 수행한다.
->
기본적으로 항등 비교는 ==를, 순서 비교는 <(~보다 작다)을 이용해서 수행한다.

[p.910 : 아래에서 7행]
for (const auto& x : m)
->
for (const auto& x : *m)

[p.911 : 3행]
for (const auto& x : m)
->
for (const auto& x : *m)

[p.916 : 2행]

[p.917 : 함수 10행]

[p.924 : 아래에서 4행]

[p.927 : 2행]

include

->

include

[p 968 : 9행]
Using cmplx
->
using cmplx

[p.1063 : 첫 번째 함수]
아래 이미지 참고

[p.1065 : 3행]

[p.1068 : 예제 코드]
using namespace std;
->
using namespace std;
using namespace std::chrono;

[p.1071 : 3행]
쉬어야
->
쉬워야

[p.1101 : 5행]

[p.1101 : 11행]
함수를
->
함수들을

[p1130 : 아래에서 9행]
123 // double: 0.123
->
.123 // double: 0.123