프로그래밍 언어 개념 로드맵 — C++로 알던 걸 Go·Rust로 잇기
클로저·코루틴·제네릭·소유권처럼 언어에 속하지 않는 개념 11편을 하나로 묶은 학습 지도. 'C++이 발판, Go·Rust는 변주'라는 관점으로 네 축의 읽는 순서와 선행 관계를 정리한다.
이 로드맵을 만든 이유
클로저, 코루틴, 제네릭, 소유권 — 이런 것들을 흔히 “JavaScript 클로저”, “Kotlin 코루틴”, “Rust 소유권”처럼 특정 언어의 기능으로 배운다. 그러다 다른 언어에서 같은 개념을 다시 만나면 처음 보는 것처럼 또 배운다.
이 시리즈의 관점은 하나다.
개념은 언어의 것이 아니다. 클로저는 1964년, 코루틴은 1963년에 나온, 지금의 거의 모든 언어보다 오래된 아이디어다. 각 언어는 그 오래된 개념의 구현체 하나일 뿐이다.
그래서 각 글은 언어 기능을 나열하는 대신 개념 자체를 세우고, 언어별 구현을 뒤에서 대응만 시킨다. 특히 C++을 공통 발판으로 삼는다 — C++은 포인터·수동 메모리·가상 함수·템플릿처럼 개념의 밑배선을 손에 쥐여주기 때문에, “C++에서 하던 그것”을 축으로 Go·Rust·기타 언어가 무엇을 기본값으로 정하고 무엇을 강제했는지의 변주로 읽으면 한 번에 꿰인다.
이 지도는 그 11편을 어떤 순서로, 어떻게 묶어 읽으면 되는지를 담았다. 개별 설명이 아니라 전체 지형과 선행 관계가 목적이다.
한눈에 보기
네 축으로 묶었다. 각 축 안에서는 위→아래가 대략 읽는 순서다.
| 축 | 글 | 난이도 | 선행 |
|---|---|---|---|
| ① 안전과 실패 | 에러 핸들링 모델 — 예외 vs 에러 값 vs Result | 입문 | — |
| Null 안전성 — nullptr·nil·Option | 입문 | 에러 핸들링 | |
| ② 메모리·값·불변 | 메모리 관리 모델 — 수동 vs GC vs 소유권 | 중급 | 스택/힙 |
| 값 vs 참조 의미론 — 복사냐 공유냐 이동이냐 | 중급 | 메모리 관리 | |
| 불변성 — const·mut·val | 중급 | 값 vs 참조 | |
| ③ 함수와 상태(스택 탈출) | 클로저 — 함수가 바깥 변수를 기억하는 법 | 입문 | — |
| 코루틴 — 스레드와 무엇이 다른가 | 중급 | (스레드) | |
| 동시성 조율 모델 — 공유 상태 vs 메시지 전달 | 중급 | 코루틴 | |
| 이터레이터와 지연 평가 | 중급 | 클로저 | |
| ④ 다형성 두 축 | 제네릭 — 파라미터 다형성 | 중급 | — |
| 서브타입 다형성 — 인터페이스·트레이트·가상 함수 | 중급 | 제네릭 |
① 안전과 실패 — 실패·부재를 어떻게 다루나
함수가 실패했을 때, 값이 없을 때, 값이 바뀌면 안 될 때를 언어가 어떻게 다루는지. 런타임에 터지게 두느냐, 컴파일 타임에 강제로 다루게 하느냐가 축이다.
- 에러 핸들링 — 예외(C++/Java) vs 에러 값(Go) vs
Result(Rust). 실패를 호출자에게 어떻게 전달하나. - Null 안전성 — “값이 없음”을 타입에 숨기느냐(C++ 포인터·Go
nil), 없애느냐(RustOption), 표시하느냐(Kotlin?).Result와Option이 같은 뿌리(합타입)라 에러 핸들링 다음에 읽으면 자연스럽다.
② 메모리·값·불변 — 값의 일생
값이 언제 잡히고 풀리는지, 넘길 때 복사되는지, 바꿀 수 있는지. 세 편이 한 줄기다 — C++이 손으로 고르던 것을 Go·Rust가 각자 기본값으로 굳혔다.
- 메모리 관리 — 수동(C++) vs GC(Go) vs 소유권(Rust). 누가 해제를 책임지나. 이 축의 뿌리.
- 값 vs 참조 — 대입이 복사냐 공유냐 이동이냐. Go는 복사 기본, Rust는 이동 기본.
- 불변성 — 값을 바꿀 수 있는가. C++
const를 Rust는 기본값으로 뒤집고 컴파일러가 강제한다. 소유권·빌림과 한 몸.
③ 함수와 상태 — 스택을 탈출하는 것들
“함수가 끝났는데 그 안의 무언가가 살아남아야 한다면?” 이 한 질문에서 나온 형제들이다. 살아남으려면 스택에서 힙으로 옮겨야 한다.
- 클로저 — 캡처한 변수가 살아남는다. 여러 글의 선행이니 이 축의 시작점.
- 코루틴 — 프레임 전체(실행 위치까지)가 살아남는다. 클로저의 큰 버전.
- 동시성 조율 — 여러 실행 흐름이 데이터를 안전하게 나눠 쓰는 법(공유 상태+락 vs 채널 vs 소유권). 코루틴의 “조율 반쪽”.
- 이터레이터와 지연 평가 — 순회를 추상화하고 어댑터에 클로저를 넘긴다. 클로저를 봤으면 착지가 쉽다.
④ 다형성 두 축 — 하나의 개념, 반대 방향
“여러 타입을 다룬다”는 같은 목표를 정반대로 푸는 두 축. 함께 읽어야 그림이 완성된다.
- 제네릭(파라미터 다형성) — 하나의 코드를 여러 타입에 찍어낸다(대개 컴파일 타임). C++ 템플릿.
- 서브타입 다형성 — 여러 타입을 하나의 인터페이스로 다룬다(런타임). C++ 가상 함수. 제네릭을 먼저 읽고 “나머지 절반”으로 이어가면 된다.
권장 진입 순서
전체를 정주행할 사람을 위한 순서다. 선행 관계를 존중하되 입문부터 쌓는다. (특정 주제만 필요하면 위 표에서 바로 골라 들어가도 된다 — 각 글은 독립적으로 읽힌다.)
언어별 로드맵과의 관계
이 시리즈는 언어를 가로지르는 개념 층이다. 특정 언어를 순서대로 익히려면 언어별 로드맵으로 간다 — 개념 글들은 그 로드맵 곳곳에서 “이건 언어 것이 아니다”라며 참조된다.
- 모던 C++ 학습 로드맵 — 개념들의 공통 발판
- Go 학습 로드맵
- Rust 학습 로드맵
이 로드맵이 다루지 않는 것
언어 문법·표준 라이브러리·빌드 같은 언어별 세부는 여기 없다(각 언어 로드맵의 몫). 이 지도는 “여러 언어에 공통으로 반복되는 개념”만 모은다. 앞으로 불변성 옆에 배열·슬라이스, 메모리 레이아웃, 패턴 매칭 같은 편이 붙으면 이 표에 한 줄씩 늘어난다.