포스트

모던 C++ 학습 로드맵 — 무엇을 먼저, 무엇을 나중에

C++ 입문부터 모던 C++까지의 학습 순서를 초급·중급·고급으로 묶고, 각 주제를 필수·나중·선택으로 표시한 로드맵. 순서의 근거·선행 지식·자주 막히는 지점을 함께 정리하고, 언어 학습과 결이 다른 코드 스타일 도구는 부록으로 분리한다.

모던 C++ 학습 로드맵 — 무엇을 먼저, 무엇을 나중에

이 로드맵을 만든 이유

C++는 배울 주제가 넓은 데다 서로 얽혀 있어서, 문법을 목차 순서대로 하나씩 훑으면 조각들이 연결되지 않습니다. 참조자를 모르면 복사 생성자가 안 잡히고, 이동 시맨틱을 모르면 스마트 포인터가 왜 그렇게 생겼는지 감이 안 옵니다.

그래서 “무슨 주제가 있나”를 나열하는 대신, 무엇을 먼저 배우고 무엇을 나중으로 미뤄도 되는지에 대한 판단을 담았습니다. 각 주제에는 세 가지 표시를 붙였습니다.

  • [필수] — 이걸 건너뛰면 다음 단계가 막힙니다. 순서대로 확실히 잡고 갑니다.
  • [나중] — 중요하지만 급하지 않습니다. 실무나 다음 단계에서 필요해질 때 돌아와도 됩니다.
  • [선택] — 특정 상황(라이브러리 저자, 고성능 코드)에서만 필요합니다. 개념만 알고 넘어가도 무방합니다.

세부 문법은 각 단계 끝의 레퍼런스로 연결합니다. 이 글의 목적은 개별 설명이 아니라 전체 지도와 우선순위입니다.

언어 학습 줄기와 결이 다른 축 — 코드 스타일을 도구로 강제하는 일(cpplint·clang-format) — 은 단계에서 빼 아래 부록으로 내렸습니다. 학습 순서와 무관하게, 팀 컨벤션을 잡을 때 찾아 들어오면 됩니다.

한눈에 보기

①~⑧의 [필수]만 세로로 따라가면 하나의 완결된 경로입니다. 부록은 학습 단계가 아니라 필요할 때 직행하는 다른 축입니다. 아래는 각 단계를 왜 그 순서·우선순위로 두는지 풀어 쓴 것입니다.

📎 치트시트 · c-cpp — C/C++ 문법·스니펫·Google 스타일·GDB 빠른 참조. 전 단계에서 곁에 두기 (GitHub)

① 초급 — C++로 사고하기

📖 상세 글: C++로 사고하기 ① 참조자와 동적 할당

C를 알면 문법 상당수는 익숙합니다. 이 단계의 목표는 암기가 아니라 C와 다른 C++의 사고방식입니다.

  • [필수] 참조자(reference) — 포인터와 다른 별칭 개념. 이후 거의 모든 주제(복사·이동·연산자 오버로딩)의 기반이라 여기서 확실히 잡습니다.
  • [필수] 동적 할당 new/delete — C의 malloc/free와 무엇이 다른지, 왜 생성자·소멸자와 묶이는지.

자주 막히는 지점: 참조자를 “포인터의 다른 문법”으로 오해하는 것. 참조자는 재바인딩이 안 되고 널이 될 수 없다는 점이 다릅니다.

통과 기준: 참조자와 포인터의 차이를 한 문장으로 말할 수 있으면 다음 단계로.

② 중급 — 객체지향

📖 상세 글: 객체지향 ② 클래스와 자원 관리

C++의 핵심 정체성인 클래스입니다. 가장 길고, 이후 모든 고급 주제의 토대가 됩니다.

  • [필수] 클래스 기초 — 함수 오버로딩, 생성자, this
  • [필수] 자원 관리 3종 — 복사 생성자·소멸자·대입 연산자가 왜 함께 등장하는지(얕은 복사 문제). RAII의 씨앗이 여기서 심어집니다.
  • [필수] conststatic — 멤버 함수·변수에 붙는 의미 구분
  • [필수] 상속과 다형성 — 가상 함수, 오버라이딩, 가상 소멸자가 왜 필요한지
  • [나중] 예외 처리 — RAII가 “예외가 나도 소멸자가 정리한다”를 전제하는데, 그 예외를 직접 던지고 잡는 법·예외 안전 3등급·noexcept. RAII를 익힌 직후 짝으로 보면 좋다. → 예외 처리 — try/catch와 예외 안전
  • [나중] 연산자 오버로딩 — 내 타입을 내장 타입처럼. 개념은 초반에, 첨자·타입변환·증감 같은 세부는 필요할 때.
  • [나중] 입출력iostream, 파일(fstream), 문자열 스트림(stringstream)

자주 막히는 지점: 얕은 복사로 인한 이중 해제, 그리고 기반 클래스에 가상 소멸자를 안 붙여서 생기는 자원 누수.

통과 기준: 복사 생성자·소멸자·연산자 오버로딩을 갖춘 커스텀 String 클래스를 직접 구현할 수 있으면 통과.

고급 — 모던 C++

C++11 이후의 본체입니다. 실무의 어려움 대부분이 이 구간에 몰려 있습니다. 성격별로 묶었고, 묶음마다 우선순위가 다릅니다.

③ 값과 소유권 (가장 먼저)

📖 상세 글: 값과 소유권 ③ 이동 시맨틱과 스마트 포인터

모던 C++의 뼈대입니다. 고급 단계에서 이 묶음을 최우선으로 두길 권합니다. 순서대로 배우면 자연스럽게 이어집니다.

  1. [필수] 우측값 레퍼런스(rvalue reference) — 임시 객체를 가리키는 참조
  2. [필수] 이동 시맨틱(std::move, 완벽한 전달) — 복사 대신 자원을 넘기기. 성능과 직결
  3. [필수] 스마트 포인터unique_ptr(유일 소유), shared_ptr/weak_ptr(공유 소유). new/delete를 직접 안 쓰게 되는 이유
  4. [나중] 함수를 객체로 — 람다, std::function, std::bind. → 람다와 클로저 — 캡처·std::function·제네릭 람다

자주 막히는 지점: std::move가 “옮긴다”고 오해하는 것. 실제로는 이동 가능하다고 표시만 하고, 실제 이동은 이동 생성자가 합니다.

④ STL

📖 상세 글: STL ④ 컨테이너와 알고리즘

  • [필수] 컨테이너vector, map, unordered_map을 먼저. list/deque는 필요할 때.
  • [필수] 알고리즘sort, find, accumulate 등 반복문을 대체하는 표준 함수
  • [나중] 문자열string, 그리고 복사 없는 뷰 string_view

⑤ 제네릭 프로그래밍

📖 상세 글: 제네릭 ⑤ 템플릿

  • [필수] 템플릿 — 타입을 인자로 받는 함수·클래스
  • [나중] 가변 길이 템플릿(variadic template)
  • [선택] 템플릿 메타 프로그래밍(TMP) — 라이브러리를 직접 만들 게 아니면 개념만 알고 넘어가도 됩니다.

⑥ 모던 문법과 표준 라이브러리

📖 상세 글: 모던 문법 ⑥ auto·constexpr와 표준 라이브러리

auto·constexpr·유니폼 초기화는 아래 동시성 코드를 포함해 이후 코드 전반에 깔리므로, 동시성보다 먼저 잡습니다.

  • [필수] 유니폼 초기화, constexpr, auto/decltype
  • [선택] 메타프로그래밍 도구type_traits, SFINAE, enable_if. 라이브러리 저자용.
  • [나중] 표준 라이브러리chrono(시간), optional/variant/tuple, filesystem, regex. 필요할 때 사전처럼 찾아 씀.

⑦ 동시성 (필요해질 때)

📖 상세 글: 동시성 ⑦ 스레드와 비동기

멀티스레드 프로그램을 짤 일이 생기기 전엔 통째로 미뤄도 됩니다. [필수] 고급 주제 중 유일하게 [나중]이라, ⑧ 빌드로 넘어가기 전 곁길에 둡니다.

  • [나중] 스레드 기초 std::thread, 동기화 뮤텍스·조건 변수
  • [나중] 비동기 future, promise, async
  • [선택] 저수준 atomic과 메모리 순서, 스레드풀 직접 구현

⑧ 마지막 — 코드에서 실행 파일까지

📖 상세 글: 빌드 ⑧ 컴파일·링킹과 CMake

문법을 넘어 프로젝트를 빌드하는 관점입니다. 규모가 커지면 반드시 마주칩니다.

  • [필수] 컴파일과 링킹 — 소스가 실행 파일이 되기까지. 링커 에러를 이해하는 열쇠입니다.
  • [필수] 빌드 시스템(Make & CMake) — 여러 파일로 나뉜 프로젝트 빌드
  • [선택] 실무 스타일 — 표준 라이브러리의 디자인 패턴, 대규모 팀의 C++ 사용 관례

📎 치트시트 · make — Makefile 자동변수·패턴 룰·.PHONY·함수 빠른 참조 (GitHub)

여기까지가 언어를 배우는 학습 줄기입니다.


부록 — 코드 스타일 자동화 (다른 축)

여기서부터는 “언어를 배우는 법”이 아니라 작성한 코드의 스타일을 도구로 강제하는 축입니다. 학습 줄기와 분리해 둡니다. 문법을 아는 것과 무관하게, 여럿이 함께 코드를 짤 때 마찰을 줄여 주므로 팀 컨벤션을 잡는 시점에 챙기면 됩니다.

핵심
Cpplint와 ClangFormat으로 Google 스타일 코드 작성cpplint로 Google 스타일 위반을 검사(lint)하고, clang-format·.clang-format 파일로 일괄 자동 포맷, 저장 시 자동 정리까지. 스타일을 사람의 의지가 아니라 도구로 고정하는 법

⑧에서 빌드 시스템을 잡았다면, 같은 프로젝트에 이 도구들을 붙여 CI에서 스타일 위반을 차단하고 포맷을 자동화하는 실전으로 이어집니다.

부록 — 표준(-std) 트러블슈팅 (막힐 때)

학습 단계가 아니라, 어느 단계에서든 auto·범위 기반 for·constexpr 같은 기능이 “extension” 경고/에러로 막힐 때 찾아오는 트러블슈팅입니다. 원인은 대부분 컴파일러가 옛 표준(-std=gnu++98 등)으로 도는 것입니다.

핵심
표준(-std) 관련 경고·에러 해결어떤 기능이 어느 표준(C++11/14/17/20)에서 들어왔는지 표로 정리하고, 명령줄·Makefile·CMake(CMAKE_CXX_STANDARD)·VS Code에서 -std를 지정하는 법

⑧의 CMake 설정(CMAKE_CXX_STANDARD, CMAKE_CXX_EXTENSIONS OFF)과 직접 이어집니다. 모던 문법이 갑자기 안 먹히면 문법이 아니라 표준 옵션을 먼저 의심하세요.

이 로드맵이 다루지 않는 것 (경계)

학습 동선을 흐리지 않으려고 의도적으로 뺀 주제입니다. 필요해질 때 밖에서 따로 챙기세요.

  • C++20 이후 대형 기능 — 모듈(modules), 범위(ranges), 코루틴(coroutines)은 이 로드맵의 [필수] 경로 밖입니다. 컴파일러·빌드 지원이 아직 고르지 않아, 위 경로를 한 바퀴 돈 뒤 필요에 따라 접근하는 편이 낫습니다.
  • 디버깅·테스트 도구gdb/lldb, 새니타이저(ASan·UBSan), 단위 테스트(GoogleTest)는 언어 문법이 아닌 실무 도구라 빼 두었습니다.

이 로드맵을 쓰는 법

  • [나중]·[선택]은 미뤄도 완결됩니다 — 실무에서 필요해질 때 돌아오세요.
  • 진도는 “봤다”가 아니라 각 단계의 통과 기준을 직접 구현할 수 있는지로 판단합니다.
  • 고급 단계에서 순서가 헷갈리면, 값과 소유권 → STL → 나머지로 잡으면 무난합니다.
  • 언어 학습이 한 바퀴 돌았다면, 부록의 코드 스타일 도구로 팀 협업 마찰을 줄이세요.

Reference

주제별 상세 설명은 아래에서. 하나에 얽매이지 말고 교차로 보는 걸 권합니다.

  • 씹어먹는 C++ 강좌 (modoocode) — 한글로 된 가장 촘촘한 강좌. 초급~고급 전 구간.
  • cppreference — 표준 라이브러리·문법의 1차 레퍼런스. 정확하지만 건조함.
  • learncpp.com — 영어권의 대표 입문 강좌. 예제 중심.
  • Effective Modern C++ (Scott Meyers) — 값과 소유권·모던 문법 구간을 깊게 이해하고 싶을 때.
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.