115 모던 C 총정리
먼저 알아야 할 것
돌아보기
1장에서 이 책은 “옛 어법의 관성으로 쓰인 입문서가 아니라 오늘의 C에서 출발하는 입문서”를 표방했다. 그러면 이 책을 다 읽은 지금, 독자가 배운 C는 옛 C와 무엇이 다른가?
답. 문법의 목록이 다른 것이 아니라 기준이 다르다. 옛 어법의 책은 “이렇게 쓰면 동작한다”를 가르치고, 이 책은 “이렇게 쓰면 계약 안이다”를 가르쳤다 — 초기화하고 쓰기(24장), 경계와 크기를 함께 다루기(39장), 실패를 값으로 확인하기(55장), 계약 밖의 지름길을 피하기(56장), 도구로 검사하기(18장). C23의 새 문법들은 그 기준을 더 쉽게 지키게 해 주는 도구로 등장했다. 아래 회고가 그 새 문법들의 목록이다.
이 장의 필요성과 맥락
이 장이 끝나면
이 장에서 답할 질문
- 여기서 어디로 가면 좋은가?
115.1 회고 — 이미 써 온 C23#
이 책은 새 표준을 따로 소개하지 않고, 필요한 자리에서 자연스럽게 썼다. 모아 보면 이만큼이다.
| C23의 것 | 처음 만난 곳 | 무엇을 쉽게 만들었나 |
|---|---|---|
bool·true·false 키워드 | 31장 | 헤더 없이 판단을 값으로 |
nullptr | 37장 | NULL의 모호함 제거 |
| 2의 보수 확정 | 6장 | 부호 표현의 이식성 고민 종료 |
[[nodiscard]] | 38·55장 | 실패 확인을 잊는 실수를 컴파일러가 차단 |
[[fallthrough]] | 32장 | switch 폴스루의 의도를 문서로 |
ckd_add 계열 | 56장 | 오버플로를 UB(undefined behaviour)가 아니라 값으로 |
alignof | 38장 | 정렬 요구를 언어 차원에서 질의 |
| 삼중자 제거 | 8장 | 문자 코드 시대의 흉터 정리 |
va_start의 완화 | 67장 | va_start 의 군더더기 인자 제거 |
표 115.1 — C23 의 것 — 처음 만난 곳
한 방향이 보인다 — 계약을 더 명시적으로, 실수를 더 빨리 잡히게. 1장에서 “C 자신도 변화의 조짐을 보이고 있다”고 한 것의 구체적 내용이 이 표다.
115.2 모던 C 관행 — 한 장의 지침#
이 책 전체를 실무 수칙으로 압축하면 이렇다.
빌드와 도구. 경고를 켠다(-Wall -Wextra). 시험 실행은 새니타이저와 함께(ASan·UBSan). 가능하면 두 컴파일러로 교차 검증한다(18장).
선언과 타입. 선언과 동시에 초기화한다. 바꾸지 않을 것은 const로 둔다. 크기가 계약인 자리에는 <stdint.h>의 고정 폭 타입을 쓴다. 크기·인덱스는 size_t 계열로 일관되게(30장의 부호 섞임 함정).
기억. 경계는 언제나 명시적으로 — 배열과 길이는 함께 다닌다. 포인터는 쓰기 전에 유효성을 확인한다. 동적 할당은 소유자를 정하고, 해제 후에는 포인터를 비운다. 가능하면 자동 수명으로 해결한다(39·46장).
오류. 실패는 값으로 알리고, 반환값은 확인한다. 내부 불변식은 assert, 바깥에서 온 것은 실행 중 검사(55장).
계약. “내 컴퓨터에서 돌았다”가 아니라 “추상 기계 위에서 옳은가”로 판단한다(13·56장).
부품. 표준 라이브러리의 계약을 알고 고르고, 반복되는 위험 지대에는 검사가 내장된 부품을 얹는다(76장·제13부).
문. 여기서 어디로 가면 좋은가?
답. 세 갈래를 권한다. 깊이 — 이 책이 문을 열어 둔 곳들: 자료구조와 알고리즘(47장의 연결 구조), 동시성(13장의 멀티코어, 94–95장의 스레드와 C11 원자), 시스템 프로그래밍(파일·네트워크는 플랫폼 API의 세계다). 너비 — 이웃 언어들: C++·Rust·Zig를 볼 때, 이 책에서 배운 기억·계약·표현의 감각이 그대로 통역된다(1장에서 예고한 대로다). 실전 — 111장에서 이름을 든 프로젝트들의 소스를 직접 읽는 것. SQLite나 curl 같은 잘 쓰인 C 코드는 이 책의 모든 주제가 실물로 살아 있는 교재다.
그리고 표준 문서 자체가 이제 읽을 수 있는 텍스트가 되었다는 것도 기억해 둘 만하다 — “계약서”라는 관점으로 보면, 그 무뚝뚝한 문서가 왜 그렇게 쓰였는지 이해된다.
115.3 부록 — 이 책 다음으로 건너가는 다리#
본문은 여기서 끝나지만 책은 조금 더 이어진다. 뒤에 붙은 열일곱 개의 부록이다. 펼치기 전에 그 성격을 먼저 밝혀 둔다.
부록에 모은 것은 본문에 넣기에는 애매하지만, C 가 실제로 쓰이는 자리에서 깊이 이해하려면 언젠가 만나야 하는 주제들이다. 본문은 표준 C 라는 계약을 지키며 걸어왔다. 그래서 특정 운영체제나 칩, 특정 도구에 묶인 이야기는 상자 하나 넘게 키우지 않았다. 그런데 C 가 주로 쓰이는 곳 — 운영체제, 임베디드, 시스템 도구, 성능이 중요한 코드 — 에서 일하다 보면 그 계약 아래의 기계를 피할 수 없다. 부록은 그 자리를 거칠고 간략하게 스케치해 둔 것이다. 주제마다 책 한 권이 필요한 것을 수십 쪽으로 줄였으니 빠진 것이 많고, 기계와 도구에 따라 달라지는 이야기도 많다.
그러니 부록을 완결된 교과서로 읽지 말고, 이 책 다음으로 건너가는 연결고리로 여기기 바란다. 어느 부록에서 흥미가 붙으면 그 부록이 가리키는 표준 문서와 자료집, 전문서로 건너가면 된다. 부록이 할 일은 그 첫걸음을 낯설지 않게 만드는 데까지다.
부록은 세 무리로 묶여 있다.
- 조회표(부록 A–F). 연산자, 서식, 암묵 변환, 표준 라이브러리, 문법, C23 의 변화. 본문에서 이야기로 배운 것을 표로 다시 접은 것이다. 처음부터 읽을 필요는 없고, 코드를 쓰다 막힐 때 펼친다.
- 기계 쪽 심화(부록 G–N). 덤프 읽기, 운영체제 없이 도는 C, 선과 버스, 디스크, 실행 파일의 형식, 부팅, 실측, 기억을 다스리는 장치. 제2부에서 그린 기계의 진짜 모습을 한 겹씩 더 내려간다. 앞의 부록이 뒤의 부록의 재료가 되도록 차례를 정했다 — 디스크와 실행 파일의 형식을 본 뒤에 부팅을 보고, 구조를 본 뒤에 그 비용을 잰다.
- 이 책 다음(부록 O–P). 「다 배웠는데 아무것도 못 만들겠다」는 벽의 정체와 그 앞의 길들, 그리고 더 읽을 책과 표준 문서를 구하는 법.
맨 끝의 부록 Q 는 이 책에 실린 표와 그림의 목록이다.
115.4 다음에 읽을 책, 그리고 표준 문서#
여기서 멈추지 않을 독자를 위해 읽을거리를 따로 모아 두었다 — 부록 P가 그것이다. C는 입문서 다음 칸이 유난히 비어 있는 언어인데, 최근 몇 해 사이 그 칸을 메우는 책들이 나오고 있다. 부록에는 그 책들의 장단점과 함께, 이 책이 내내 “계약서”라 불러 온 표준 문서를 실제로 구하는 방법 (구입과 무료 초안 내려받기)을 적어 두었다.
그리고 읽는 것 말고 만드는 것이 막힌다면 부록 O가 그 자리다. 「C 를 다 배웠는데 아무것도 못 만들겠다」는 벽의 정체와, 그 앞에서 고를 수 있는 길들을 적어 두었다.
115.5 마지막으로#
이 책은 2장에서 컴퓨터를 세 부품으로 그리는 것으로 시작했다. 그 그림은 곧 정직하게 무너졌고 — 기억은 사다리가 되고, 실행은 겹쳐지고, 편집자가 끼어들었다 — 그 자리에 남은 것이 계약이었다. C를 안다는 것은 문법을 외우는 일이 아니라 그 계약을 읽을 줄 아는 일이라는 것, 이 책이 하고 싶었던 말은 그것 하나다.
읽는 것만으로 여기까지 온 독자에게, 이제 남은 것은 하나뿐이다 — 읽은 것을 자기 코드로 써 보는 것. 좋은 여정이 되기를.