아주 오래 전, 프로그래머로 먹고 살기 위해 밤을 새워가며 C를 배워야 했을 때(C++도 나오기 전이었다) 내 월급의 절반을 써서라도 프로그래밍 멘토를 구했다면 멘토는 이렇게 조언했을 것이다. “바로 이 부분이 잘못됐네…… C를 배우면서 저지르는 오류들 말이야. 자, 이 오류를 피하려면 이렇게 해야 하네.” 하지만 난 멘토를 구하지 않았고, 프로그램을 작성할 때 저지를 수 있는 모든 오류를 다 저지르고 다녔으며, 그걸 스스로 해결하기 위해 단맛 쓴맛을 다 맛봐야 했다.
내가 말하고 싶은 것은 글을 쓸 줄 아는 프로그래머나 프로그램을 작성할 줄 아는 작가가 필요하다는 이야기가 아니다. 그런 사람은 드물다. 그보다 더 더욱 드문 건 프로그래머이면서 작가이고 선생님인 사람이다. 즉, 기초적인 사항들을 가르쳐주면서 잘 이끌어가고, 이 언어가 이렇게 만들어진 이유를 알려줌으로써 왜 이렇게 하면 유용할 뿐 아니라 멋지기까지 한지에 대해 열심히 설명해줄 수 있는 사람은 정말 드물다.
그런 사람을 찾는 건 정말 어려웠다. 그래서 나는 내가 그런 사람이 돼야겠다고 결심했다.
이후 마이크로소프트 사에서 일하면서 기술 지원과 테스트로 일을 시작했고 관리자로의 길을 걷기 시작했다. 하지만 내게 가장 중요했던 일은 새로운 기술을 설명하는 일이었다. 때로 나는 프로그래밍 언어의 새로운 기능을 접하는 두 번째나 세 번째 사람이었고, 암호문 같은 내용을 우주에 존재하는 다른 모든 사람이 이해할 수 있게 풀어 써야 했다. “간단하게 만들라”라는 목표는 그냥 일이 아니라 내 사명이었다.
이 책의 특징
이 책이 다른 점은 무엇일까 바로 내가 여러분, 그러니까 독자 여러분을 지지한다는 점이다. 나는 어떤 위원회의 편이 아니라 여러분의 편이다. 나는 여러분이 프로그램을 ‘만들게 된 이유’도 다 알고 있으며, 왜 프로그램이 개선돼야 하는지도 알고 있다(그런 문제들도 다룰 생각이다). 하지만 내가 제일 신경을 많이 쓴 것은 무엇이 어떻게 동작하는가를 설명하는 부분이었다.
이 책을 쓸 때 나는 여러분이 프로그래밍에 대해서는 전혀 모른다고 가정했다. 그래도 여러분이 컴퓨터를 켜고 마우스를 움직일 수는 있다고 생각했다. 좀 더 많은 걸 알고 있다면 처음 몇 장은 가볍게 뛰어넘어도 좋다.
C와 C++의 창시자(데니스 리치(Dennis Ritchie)와 비야네 스트루스트룹(Bjarne Stroustrup))는 천재들이고, 난 그들의 성과에 경외심을 느낀다. 물론 C와 C++는 위대한 언어이지만 초보자들(그리고 상대적으로는 더 숙련된 프로그래머들)이 앞으로 적어도 몇 년 동안 절대 사용하지 않을 기능들도 좀 있다. 어떤 언어 기능을 무시할 수도 있고, 왜 무시해야만 하는지를 이야기하는 게 난 전혀 두렵지 않다. 동시에 나는 여러분께 시간과 에너지를 절약해주는 C++의 멋진 기능들을 알려주려고 애쓸 생각이다.
이 책은 실용적인 예제들에 관한 책이다. 그리고 재미있게 읽을 수 있는 책이기도 하다! 이 책의 예제 대부분은 유용하고 실용적이며 예제 자체가 매우 흥미롭다(퍼즐이라든지 게임을 주로 다루었으니까 말이다).
그러니 두려워 말자! 난 데이터 추상 같은 용어들을 너무 많이 써서(너무 남용되는 경향이 있다) 여러분이 정신을 놓게 만들지 않을 것이다. 교수님들이 그런 용어들을 정말 좋아하긴 하지만 대다수의 사람들에게는 여전히 혼란스러운 개념일 뿐이다. 여러분이 정말로 알기 원하는 몇 가지 용어(객체지향과 다형성)에 대해서는 쉽게 이해해서 바로 사용할 수 있도록 견고하고 실용적인 예제로 설명한다.
개정판에서 달라진 내용
초판은 지난 몇 년간 정말 잘 팔렸다. 완결된 예제, 연습문제, 개념적인 기술에 대한 풍부한 예제를 통해 C++ 프로그래밍을 공부하는 여러 가지 방법을 제시하는 기념비적인 책이었다. 개정판은 이 책만의 강점을 다음과 같이 좀 더 강화시켰다.
C++11의 새 기능 설명: 이 책을 여러분이 손에 쥐었을 때쯤에는 이미 C++11이 C++의 새로운 표준이 돼 있을 것이다. 컴파일러 판매자들은 이 표준을 지원하기 위해 새로운 C++를 내놓았거나 내놓으려 할 것이다. 이 책은 새 표준에서 제공하는 많은 기능들을 깊이 있게 살펴본다.
퍼즐과 게임을 다루는 풍부한 예제: 2장이 끝날 때쯤이면 프로그램을 어떻게 입력하는지 배울 것이며, 한 페이지도 안 되는 코드로도 완전한 게임을 만들 수 있고, 게다가 컴퓨터가 취할 최적화 전략도 구현할 수 있을 것이다. 하지만 이건 그저 시작일 뿐이다. 개정판에는 초판보다 더 재미있는 퍼즐과 게임들을 더 많이 소개한다.
개념적인 기술에 대한 풍부한 사용 예제: 추상적인 사항들을 명확하게 설명한 것이야말로 초판의 가장 큰 강점이었다. 이번 판은 그 강점을 이어받아 좀 더 풍부한 예제를 덧붙였다.
풍부한 연습문제: 공부할 때 가장 좋은 방법은 연습이다. 많은 연습문제를 통해 예제가 어떻게 동작하는지, 왜 그렇게 동작하는지, 자신만의 기능을 추가하려면 어떻게 수정해야 하는지 알아 볼 수 있다.
뜻이 잘 통하는 문법 도식: 게임을 프로그래밍하고 직접 게임을 하는 것은 재미있다. 하지만 프로그래밍을 배우려면 직관적인 정보가 필요할 때도 있다. 이 책에서 사용한 문법 도식은 다양한 예제를 사용해 실제 언어가 동작하는 방법을 정확하고 명확하게 보여준다. 한 명령문, 한 명령문, 한 키워드, 한 키워드 단위로 말이다.
표준 템플릿 라이브러리(STL, standard template library) 소개: STL 매뉴얼 전체를 다룰 만한 지면이 부족했지만, 개정판에서는(초판과 달리) 이 멋진 C++ 기능에 대해 궁금해 하는 독자들을 위해 STL을 사용하면 시간과 에너지를 얼마나 절약할 수 있는지, 그리고 정말로 짧은 코드만으로도 강력한 애플리케이션을 만들 수 있음을 설명한다.
늘어난 참고 자료: 맨 뒤의 부록은 C++ 프로그램을 작성할 때 들춰볼 수 있는 작은 책상용 참고 자료로 만들었다. 개정판에서는 이 부록 부분을 크게 확장했다.
철학을 담은 칼럼: 책 전반에서 C++와 관련이 있는, 하지만 컴퓨터 과학, 프로그래밍의 역사, 수학, 철학과 인공지능 등과 같은 더 넓은 세상에 영향을 주는 영역으로 우회하기도 할 생각이다. 하지만 이런 칼럼은 따로 구분돼 있으니 주제의 흐름을 방해하진 않을 것이다. 심심할 때 읽어봐도 좋다.
---「저자 서문」 중에서
나는 컴퓨터 공학을 전공하고 지금도 프로그래머로 일하고 있긴 하지만, 사실 대학에 들어오기 전까지는 C++라는 게 뭔지도 몰랐다. 게다가 내가 다닌 대학은 그다지 친절한 편도 아니어서 프로그래밍 언어 정도는 스스로 알아둬야 하는 기본 교양이었다. 그래서인지 이 책을 번역하면서 “내가 대학 1학년일 때 이 책이 있었다면 대학 생활이 얼마간은 편해졌을 텐데”라는 생각이 많이 들었다.
hello, world로 시작하는 수많은 입문서들이 있고, 그 책들의 설명에 틀린 점도 없는데 왜 그렇게도 도움을 받지 못했던 걸까 정말 C와 C++에 대해 아무것도 모르는 사람이 어떤 유용한 것(이를테면 학교 프로젝트)을 만들어낼 수 있으려면 뭘 알아야 하는 것일까 아마 이 책을 집어 든 여러분도 이미 집에 몇 권쯤 쌓여있는 책들을 보면서 내가 문제인 것인지, 책이 문제인 것인지 진지하게 고민 좀 해봤을 것 같다.
대학을 졸업한 지도 벌써 10년이 지난 지금, 그 의문에 대한 나의 답은 단순하게 정리됐다. “프로그래밍 언어도 언어다. 단지 대화하는 대상이 애매한 건 못 참는 컴퓨터이고, 대화 내용이 그다지 평범하지 않을 뿐이다.”
여러분은 계산하는 기계인 컴퓨터에 뭘 묻고 싶은가 내일 증시 동향 경마 우승마 로또 번호 아쉽게도 컴퓨터가 이런 질문에 대한 답을 주진 못한다. 하지만 컴퓨터는 백치천재들과도 같아서, 1,024년의 부활절이 언제였는지, 아니면 여러분의 128세 생일이 화요일인지 수요일인지는 자신만만하게 알려줄 수 있다. 그러니 이런 계산은 컴퓨터에 맡기자. 이 책의 저자처럼 ‘두려움을 느끼지 않고’ 용감하게, 어떻게 하면 더 짧은 시간 내에 답을 얻어낼 수 있는지, 어떻게 하면 노동시간은 줄이면서도 더 어려운 계산을 하는 프로그램을 쉽게 만들 수 있는지는 그렇게 한걸음 내딛고 난 후 고민해도 상관없다.
일단 시작하자. 여러분도, 그 많은 입문서들도 문제는 없었다. 하지만 이 책으로 시작하면 좀 더 쉬울 것이다.
---「옮긴이의 말」 중에서