1P by GN⁺ | ★ favorite | 댓글 1개
  • 『Programming: Principles and Practice Using C++』 3판은 프로그래밍을 처음 배우는 독자를 주 대상으로 하며, 경험이 조금 있는 독자에게도 현대 C++ 와 더 나은 스타일·기법을 익히는 입문서로 쓰일 수 있음
  • 책의 중심은 C++ 문법 세부 암기가 아니라 프로그래밍 기본 원리와 실전 기술이며, 절차적·객체지향·제네릭 프로그래밍을 함께 다룸
  • PPP3는 PPP2보다 약 절반 크기로 줄었고, 한 학기 과정에서 다루는 기초 장을 강화하면서 C++20·C++23과 Qt 기반 Graphics/GUI 코드를 반영함
  • 더 전문적인 장과 순수 참고 자료는 웹으로 옮겨 필요할 때 보게 했으며, 최신 참고 정보는 cppreference.com 같은 웹 자료로 보완하는 흐름임
  • 샘플 PDF, PPP 모듈·헤더, Qt GUI 코드, 강의 슬라이드, 코딩 스타일 가이드 등이 제공되어 수업과 자습 모두에 활용 가능함

책의 목표와 독자

  • 『Programming: Principles and Practice Using C++ (3rd Edition)』, 약칭 PPP3, 는 프로그래밍 경험이 없는 사람을 위한 입문서임
  • 이미 조금 프로그래밍해 본 독자도 스타일과 기법을 개선하거나 현대 C++ 를 배우는 자료로 활용할 수 있음
  • 수업용으로 설계됐지만 자습도 염두에 두고 작성됨
  • 이전 판은 Texas A&M University의 전기공학, 컴퓨터공학, 컴퓨터과학 학생 대상 첫 프로그래밍 수업과 여러 곳에서 사용된 바 있음

프로그래밍을 가르치는 방식

  • 책은 독자가 결국 다른 사람이 사용하고 유지보수할 수 있을 만큼 좋은 프로그램을 작성하게 되는 것을 목표로 삼음
  • 초점은 지엽적인 언어 기술 세부사항보다 기본 개념과 기법에 있음
  • 단순한 C++ 언어 입문서가 아니라 프로그래밍 일반에 대한 입문서로 구성됨
    • 절차적 프로그래밍
    • 객체지향 프로그래밍
    • 제네릭 프로그래밍
  • 현대적인 고수준 기법과 함께, 하드웨어를 효율적으로 쓰는 데 필요한 저수준 기법도 다룸
  • 유용하고, 정확하고, 타입 안전하고, 유지보수 가능하며, 효율적인 코드를 작성하기 위한 기반을 제공함
  • 필수 개념, 설계와 프로그래밍 기법, 언어 기능, 라이브러리를 폭넓게 다룸

3판에서 달라진 점

  • PPP3는 PPP2에 비해 약 절반 크기
  • 한 학기 과정에서 보통 다루는 기초 장을 강화해 분량을 줄임
    • C++20과 C++23의 핵심 부분을 활용함
    • Graphics/GUI 장의 코드를 Qt 기반으로 다시 구성해 브라우저와 휴대폰 같은 환경에서의 이식성을 고려함
  • PPP2에서 “broadening the view”로 불리던 더 전문적인 장은 필요할 때 사용할 수 있도록 웹에 배치함
  • 순수 참고 자료는 제거됨
    • 더 많고 최신인 자료를 웹에서 찾을 수 있으며, 예로 cppreference.com이 언급됨

C++ 표준과 라이브러리 범위

  • 책은 C++20과 C++23을 사용함
  • 내장 타입과 사용자 정의 타입의 설계와 사용을 다룸
    • 입력
    • 출력
    • 계산
    • 간단한 그래픽/GUI
  • C++ 표준 라이브러리의 컨테이너와 알고리듬 입문도 포함함

공개된 샘플 자료

  • Preface: 책이 약속하는 것과 약속하지 않는 것을 다룸
  • Table of Contents: 목차 PDF
  • Chapter 0: Notes to the Reader: 책의 접근 방식 안내
  • Chapter 10: A Display Model: 샘플 장
    • 완전 초보자는 아직 읽지 않는 편이 좋음
    • 교사와 경험 있는 독자에게 주당 2장 기준 약 5주 차에 책이 도달하는 수준을 보여주기 위한 장임
    • 현대 C++의 일부를 보여주는 목적도 있음

지원 자료와 코드

웹에 남아 있는 PPP2 장

번역 현황

  • PPP3의 번역판은 아직 없음
  • 이전 판의 번역은 book covers page에서 확인할 수 있음

댓글과 토론

Hacker News 의견들
  • 이 책의 “고전적인 첫 프로그램”이 첫 줄부터 import std; 를 쓰는 건 꽤 문제라고 봄. 아는 한 MSVC 정도를 빼면 어떤 컴파일러도 기본 상태에서 제대로 지원하지 않음
    Debian에서 g++ --std=c++23 -fmodules-ts를 해도 안 되고, https://en.cppreference.com/w/cpp/23를 보면 관련 제안은 P2465R3인데 clang++ 17도 “부분 지원”임. clang++17을 설치해도 module 'std' not found가 나옴
    import std;가 아주 새로운 기능이라는 건 이해하지만, 이 책은 C++ 입문자용인데 평균적인 초보자가 어떻게 반응할지 궁금함. 1~2년 전 “Tour of C++”를 읽을 때도 같은 문제를 봤음

    • 좋은 지적이고 나도 같은 일을 겪었음. 내 g++도 정확히 같은 오류와 안내를 냄
      지금 논의 중인 Stroustrup 최신판은 읽지 않았지만, 예전 판은 C++를 매일 쓰던 시절에 읽었음. 20년이 지난 지금도 Koenig와 Moo의 Accelerated C++ 를 더 선호함. 이후 더 좋은 책이 나왔을 수도 있지만 읽어보진 못함
      기억하기로 그 책의 Hello World는 #include, int main(), std::cout << "Hello, world!" << std::endl; 같은 형태였고, 지금 Arch Linux에서도 g++ a.cpp로 빌드해 ./a.out을 실행하면 그대로 동작함
      책 전체는 현대 C++로 C의 포인터 산술 없이 거의 의사코드처럼 단순하고 깔끔한 스타일을 흉내 내는 뛰어난 구성이었음. 초기 Python의 단정한 느낌과도 비슷했는데, Python 쪽은 나중에 pandas가 numpy, scipy 같은 C++ 래핑 라이브러리를 끌고 오기 전까지는 그런 요소가 없었음
      실무에서는 깔끔한 C++ 코드를 거의 못 봤음. FAANG에서 일한 건 아니고 빠른 프로토타입에서는 코드 리뷰도 드물어서, 내가 겪은 그린필드 세계 밖에서 Koenig와 Moo식 지도가 얼마나 퍼져 있는지는 모르겠음. 방사선 치료 분야처럼 다음 Therac-25가 되지 않으려는 곳은 예외일 수 있음
    • 현재 GCC 13.2.1 문서는 표준 라이브러리가 import 가능한 헤더 유닛으로 제공되지 않는다고 말함. 그런 유닛을 import하려면 먼저 명시적으로 빌드해야 하고, 조심하지 않으면 모듈 장치가 병합해야 하는 중복 선언이 생겨 컴파일러 자원 사용량이 헤더 파일 분할 방식에 영향을 받을 수 있음
      그래서 지금은 적절한 모듈 파일을 먼저 작성해야 import가 동작함. 다만 GCC의 표준 C++ 라이브러리 갱신이 오래 걸리진 않을 것 같아서, 나중에는 이 새 책을 그대로 바로 사용할 수 있을 듯함
      이미 오래된 C++를 알고 지식만 갱신하려는 사람에게는 해당 모듈 파일을 직접 작성하는 것 자체가 좋은 학습 경험이 될 수도 있음
    • 이제는 흥미로운 C++ 프로그램을 빌드 시스템 없이 유지하는 게 현실적이지 않음. 그래도 예로 든 g++ 호출은 언젠가 누군가 GCC에 패치를 넣으면 컴파일러의 특수 처리로 동작하게 될 가능성이 큼
      대체로 연구용 예제를 빼면 g++ 호출을 직접 엮는 방식은 더 이상 현실적이지 않음. 다른 컴파일 언어도 gccgo, rustc, javac를 직접 만지기보다 gobuild, cargo, Maven 같은 시스템을 씀
      https://www.kitware.com/import-std-in-cmake-3-30/
    • 책 페이지에서 참조하는 이 문서가 모듈 문제에 도움이 될 수도 있음: https://www.stroustrup.com/module_use.html
  • GUI 장에서 FLTK 대신 Qt로 바꿨음. 업계에서 Qt가 널리 쓰이니 꽤 큰 변화이고 좋은 반응을 얻을 듯한데, 학습 곡선이 어떻게 달라질지는 모르겠음

    • Stroustrup이 Meta Object Compiler를 어떻게 생각하는지 궁금함. 어떤 면에서는 Qt가 C++의 자체 방언처럼 느껴짐
    • Qt에는 Qt Creator가 있으니 더 나아진 쪽이라고 봄
    • 사용자 정의 래퍼 라이브러리를 쓰기 때문에, 실제 Qt가 얼마나 노출되는지는 잘 모르겠음
    • 써본 AI 코딩 도우미 4개(claude3, gemini, gpt4, deepseek) 모두에게 C++로 boids와 Game of Life를 짜 달라고 했더니 그래픽에 SFML을 썼음
      크로스 플랫폼이라서 그런 건지, 아니면 이 모델들이 학습한 코드에 SFML 사용 예제가 더 많아서 그런 건지 궁금함. SFML은 Qt나 FLTK보다 비교적 최근 것 같은데 학습 데이터가 더 많다는 건 이상하고, 4개 모두 C++ 그래픽에는 SFML을 쓰자고 일치한 것도 묘함
  • Stroustrup 코드에서 마음에 드는 건 using namespace std; 임. std::every std::last std::bloody std::thing처럼 모든 것 앞에 std::를 붙이는 관례는 사람을 미치게 함

    • 경우에 따라 다름. 헤더 파일에는 어떤 이름공간이든 using namespace 를 절대 넣으면 안 됨. 이름공간이 피하려고 만든 이름 충돌을 바로 그렇게 만들기 때문임
      구현 파일에서도 개인적으로 using namespace std;를 좋아하지 않음. 코드 가독성이 떨어진다고 보고, std::의 내용이 너무 크고 계속 커지므로 이름 충돌 가능성 자체를 피하고 싶음
      코드는 한 번 쓰지만 여러 번 읽기 때문에, 이름공간까지 포함해 짧은 이름을 택하는 건 효율 면에서 나쁜 선택처럼 보임
    • 이름 충돌이 없는 건 좋음. 그런데 어떻게든 다른 언어들은 이 문제를 해결했음
    • C++ 모듈이 제대로 자리 잡으면 이건 더 이상 논쟁거리가 아니게 되는 것 아닌가 싶음
    • std 자체보다 이중 콜론 :: 이 흉물임. 왜 다른 언어들처럼 그냥 점 하나를 쓰지 못했는지 이해한 적이 없음
    • Windows에서 프로그래밍을 배웠던 것 같음
  • 10년 넘게 C++를 안 썼지만, 이 책의 이전 판을 정말 깊게 공부했던 기억이 있음. 대학에서 4년 동안 거의 99% C++를 쓴 뒤였는데도 그랬음
    정말 좋은 책임. 책 속의 C++를 시간을 들여 제대로 이해하면, 세상이 왜 그렇게 C++를 두려워했는지 조금 슬프게 느껴질 정도임
    물론 그 뒤에 이런 책을 전혀 읽지 않고 끔찍한 C++ 코드를 쓰는 사람들을 무더기로 만나게 됐음

  • C++로 일하던 시절이 그리움. 예전보다 개발 스택의 더 낮은 층으로 내려간 느낌임. 예전에는 UI, API 파싱, 거의 모든 걸 C++ 로 처리했음

    • 한동안 Fortran이 그리웠는데, 30분 정도 짜 보니 바로 치료됐음. C++로 JSON 파싱을 한번 해 보고 그리움이 그 과정을 버티는지 보면 됨
    • 나도 정말 그리움. 그리 오래전도 아닌데 클라이언트와 서버가 모두 C++인 앱이 있었고, UI, API, 모든 게 C++였음. 정말 범용 언어가 도착한 것처럼 느껴졌음
      완벽했다고 하진 않겠지만 일은 재미있었고, 그 스택에서 일할 수 있는 높은 수준의 사람들과 함께하는 게 즐거웠음. 블레이드 서버에서 distcc를 돌려 빌드를 훨씬 빠르게 만들었을 때만큼 흥분되는 점심시간은 없었음. Linux 열성 사용자가 나 혼자가 아니었던 것도 즐거웠음
    • 우리 회사에서는 UI를 제외한 거의 모든 게 C++임. UI가 C++가 아닌 유일한 이유는, 신입 졸업자들이 C++ 훈련을 받기 전에도 바로 작업할 수 있는 코드베이스 일부를 남기기 위해서라고 봄
    • C++ 갈증을 풀려고 아직도 개인 프로젝트로 게임 엔진을 조금씩 만짐. 온갖 비판에도 C++ 쓰는 걸 정말 좋아함
    • 그냥 Python으로 일하지 않기를 바람
  • 지난 1년 동안 2판의 대부분을 끝냈음. 정말 훌륭한 책이고, 수년간 프로그래밍에서 부딪혔던 여러 정신적 장벽을 넘는 데 도움이 됐음
    이번 판이 줄어든 주된 이유는 Part IV: Broadening the View가 빠졌기 때문임. 텍스트 처리, 수치 계산, 임베디드 시스템 같은 추가 주제를 다루던 이 부분은 이제 온라인에서 제공됨. 해당 장들은 여전히 관련 있고 C++11/14를 쓰므로 2판에서 갱신되지는 않았음

  • 현대 C++를 계속 갱신하는 책인 C++ Annotations도 공유함: http://www.icce.rug.nl/documents/cplusplus/

    • 에뮬레이터 프로젝트에서 클래스가 있는 C에 스마트 포인터와 auto만 더해 쓰는 정도면 꽤 괜찮은 접근일지 궁금함
      예전에 C++에는 네 가지 구성요소가 있다는 말을 들었음. 첫째는 “C”, 둘째는 객체지향, 셋째는 STL과 템플릿 같은 생산성과 유연성, 마지막은 volatile, asm 같은 특수 상황용이라는 분류였음. 그는 1번은 조심해서 쓰고 4번을 써야 하는 상황은 피하라고 권했는데, 이게 말이 되는지 궁금함
    • 404가 뜸
  • 더 두꺼운 벽돌책이 될 줄 알았는데, 놀랍게도 절반으로 줄었음
    2판은 페이퍼백 1312쪽, 무게 4.81파운드였고, 3판은 페이퍼백 656쪽, 무게 2.71파운드임

    • 서문을 보면 참고 자료 상당 부분을 책에서 빼고 인터넷의 C++ 문서로 넘긴 듯함
      “Programming: Principles and Practice Using C++” 3판은 2판의 절반 정도 크기이고, 책을 들고 다녀야 하는 학생들은 가벼워진 무게를 반길 것이라고 함. 줄어든 이유는 C++와 표준 라이브러리에 관한 더 많은 정보가 웹에 있기 때문이라고 되어 있음
    • C++ 지식을 파운드 단위로 세는 걸 보니 좋음
    • 말 그대로 정확히 절반임. 글꼴을 더 작게 고른 건지 궁금함
  • Bjarne은 왜 #include 뒤에 공백을 넣을 때도 있고 안 넣을 때도 있는지 궁금함
    https://www.stroustrup.com/PPPheaders.h

    • 손으로 입력한 헤더와 IDE가 자동 삽입한 헤더가 섞였고, 여기에 import를 기본으로 접는 설정이 있었거나 저장 시 clang-format을 안 돌렸다면 놓칠 수 있음
  • 새 버전이 나온 건 정말 기대됨. C++에 관심이 없거나 이미 숙련된 프로그래머라도 이 책은 읽어볼 만함
    내가 아는 범위에서 기술 글쓰기와 컴퓨터 프로그래밍 교육의 가장 좋은 사례 중 하나임