포스트

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

C++ 입문부터 모던 C++까지의 학습 순서를 초급·중급·고급으로 묶고, 각 주제를 필수·나중·선택으로 표시한 로드맵. 순서의 근거, 선행 지식, 자주 막히는 지점을 함께 정리한다.

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

이 로드맵을 만든 이유

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

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

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

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

한눈에 보기

[필수]만 세로로 따라가면 하나의 완결된 경로입니다. 아래는 각 단계를 왜 그 순서·우선순위로 두는지 풀어 쓴 것입니다.

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

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

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

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

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

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

② 중급 — 객체지향

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

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

  • [필수] 클래스 기초 — 함수 오버로딩, 생성자, this
  • [필수] 자원 관리 3종 — 복사 생성자·소멸자·대입 연산자가 왜 함께 등장하는지(얕은 복사 문제). RAII의 씨앗이 여기서 심어집니다.
  • [필수] conststatic — 멤버 함수·변수에 붙는 의미 구분
  • [필수] 상속과 다형성 — 가상 함수, 오버라이딩, 가상 소멸자가 왜 필요한지
  • [나중] 연산자 오버로딩 — 내 타입을 내장 타입처럼. 개념은 초반에, 첨자·타입변환·증감 같은 세부는 필요할 때.
  • [나중] 입출력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::move가 “옮긴다”고 오해하는 것. 실제로는 이동 가능하다고 표시만 하고, 실제 이동은 이동 생성자가 합니다.

④ STL

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

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

⑤ 제네릭 프로그래밍

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

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

⑥ 동시성 (필요해질 때)

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

멀티스레드 프로그램을 짤 일이 생기기 전엔 통째로 미뤄도 됩니다.

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

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

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

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

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

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

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

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

이 로드맵을 쓰는 법

  • [필수]만 따라가도 하나의 완결된 경로가 됩니다. [나중]·[선택]은 실무에서 필요해질 때 돌아오세요.
  • 진도는 “봤다”가 아니라 각 단계의 통과 기준을 직접 구현할 수 있는지로 판단합니다.
  • 고급 단계에서 순서가 헷갈리면, 값과 소유권 → STL → 나머지로 잡으면 무난합니다.

Reference

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

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