Proven C Book
프로븐 C 라이브러리와 함께하는 현대적 C 입문
초안(draft)
rubidus@gmail.comgithub.com/rubidus-api/proven_c_book
이 책은 C 언어 입문서와 proven C 라이브러리 소개를 겸하고 있습니다.
대상 독자는 C 언어에 막 입문하려는 초보자부터,
입문서를 막 뗀 중급자까지입니다.
이 판은 초안(draft)이다. 쪽 번호가 붙은 찾아보기와 정확한 조판은 PDF를 보라.
책 내용에 궁금한 것이 있으면 질문 게시판에 남겨 주세요. 시간이 되는 대로 아는 범위 안에서 답하겠습니다. 한국어와 영어 어느 쪽이든 괜찮습니다. 오탈자나 틀린 내용은 이슈 쪽이 낫습니다.
목차
제1부 — 바탕: 기계와 기억
제2부 — 기계의 진짜 모습: 표현과 실행
6 정수의 표현 — 부호, 오버플로, 시프트7 수의 표현 — IEEE 754라는 계약8 문자와 텍스트 — 표준 속의 흉터9 스트림의 기원 — 펀치카드, 라인프린터, 프린터 터미널10 프로그램과 프로세스 — 실행된다는 것11 멀티태스킹과 인터럽트 — 번갈아 도는 기계12 기억의 분화 — 레지스터, 캐시, 다층의 사다리13 속도의 기계장치 — 표준의 탄생14 컴파일러 최적화 — 추상 기계15 그래서 C는 추상적인 언어다
제3부 — 첫 프로그램
제4부 — 최소한의 도구 상자
제5부 — 선언: 이름을 만드는 법
제6부 — 값과 제어
27 타입의 갈래 — 표준이 가른 것들28 정수 — 유한한 수의 세계29 정수의 연산 — 나눗셈, 비트30 암묵적 변환(implicit conversion) — 진급과 통상 산술 변환31 불리언과 비교32 결정 — if와 switch33 반복 — 루프와 불변식34 함수의 의미 — 값 복사와 부수효과35 대입과 부수효과
제7부 — 기억
36 객체, 주소, 포인터37 널 — 삼형제의 정식 취급38 포인터의 규칙 — 정렬과 프로버넌스39 배열40 다차원 배열41 배열과 포인터 — 언제 같고 언제 다른가42 반복의 기법 — 중첩, 탈출, 그리고 블록 만들기43 문자열44 안전한 입력 — 넘침을 막고, 실패를 다루기45 수명과 저장 기간46 동적 메모리
제8부 — 자료의 모양
47 구조체48 구조체를 부리는 법 — 임시 값, 이름 붙은 인자, 배치49 공용체와 표현50 직렬화 — 기억 속 값을 바이트의 약속으로51 자료 배치와 캐시 — 구조체의 배열인가, 배열의 구조체인가
제9부 — 깊은 구석들
52 수식과 연산자53 비트를 다루는 법 — 관용구와 함정54 실수 — 근사의 수학55 오류와 계약56 정의되지 않은 동작57 메모리 사고 도감58 메모리를 다스리는 법 — 수명, 소유, 그리고 다른 언어의 수집기
제10부 — 구성과 연결: 파일에서 선언까지
59 main의 세 얼굴 — 진입점과 종료 상태60 여러 파일로 나누어 짓기 — 번역 단위와 연결61 링크와 ABI — 이진 수준의 약속62 이름이 쓰일 수 있는 범위 — 스코프63 이름의 세계 — 네 이름 공간과 세 축64 이름 충돌을 다루는 법 — 접두어에서 namespace까지65 전처리기와 번역 단계66 함수 선언과 호출식 — 부르는 일의 안쪽67 가변 인자 함수68 함수를 값으로 — 함수 포인터69 선언을 읽는 법 — 두 가지 독법과 typedef
제11부 — C 로 흉내 내는 객체 지향 프로그래밍
70 객체 지향을 흉내 내기 — 원론과 C 의 맨손71 표를 짓는 법 — 다형성, 상속, 오버로딩, 판, 수명72 동적 가상 테이블 — 짓고, 봉인하고, 찾는다73 간접 호출의 비용 — 재고, 줄이고, 지킨다74 C 로 지은 객체들 — 사례와 논문75 한계와 쓰지 않을 때 — 매크로, SOLID, 그리고 처음으로
제12부 — 표준 라이브러리 정독
76 표준 라이브러리의 지형77 표준 라이브러리 한눈에 보기78 스트림의 실제 — <stdio.h> ①79 읽고 쓰기의 함정 — <stdio.h> ②80 문자열과 기억 — <string.h>81 잡동사니 서랍 — <stdlib.h>82 문자 분류 — <ctype.h>83 로케일 ① — 프로그램의 지역 설정84 로케일 ② — 숫자·통화·시간·정렬85 와이드 문자 ① — wchar_t와 멀티바이트 변환86 와이드 문자 ② — 플랫폼의 현실과 와이드 입출력87 실무 — 유니코드와 멀티바이트를 다루는 법88 수 — <math.h>·<fenv.h>·<tgmath.h>89 시간 — <time.h>90 진단과 제어 — <errno.h>·<assert.h>·<signal.h>·<setjmp.h>91 신호 — <signal.h>92 비지역 점프 — <setjmp.h>93 새 표준이 보탠 것과 *_s 논쟁94 갈래를 나누어 돌리기 — <threads.h>95 쪼개지지 않는 연산 — <stdatomic.h>96 넘침을 묻는 법 — <stdckdint.h>97 매크로에서 키워드로 — bool·nullptr과 그 동료들98 프로그램의 기억 배치 — 운영체제와 임베디드99 할당자의 속 — 힙, 대안 할당자, 대안 표준 라이브러리
제13부 — proven — 새로운 안정적인 기반
100 50년째 출하되는 다섯 가지 버그101 proven이란 무엇인가 — 그리고 시작하기102 에러는 값이다103 기반 — 바이트, 뷰, 그리고 넘치지 않는 산술104 할당은 매개변수다105 문자열과 텍스트106 형식화와 파싱 — 타입을 두 번 적지 않기107 컨테이너와 알고리즘108 바깥 세계 — 파일, 스트림, 시간, 난수109 경계 — 겹쳐 돌리기, 그리고 OS가 없을 때110 세 판으로 짜 보기 — 간이 JSON
제14부 — 닫으며
111 실전의 C — 도구, 프로젝트, 그리고 영역112 빌드와 시험 — 여럿이 짓는 프로젝트의 구조113 일이 굴러가는 방식 — 어휘와 절차114 임베디드의 도구 상자 — 컴파일러와 그 곁의 연장들115 모던 C 총정리
부록과 찾아보기
부록 A — 연산자 조회표부록 B — printf·scanf 서식 완전 정리부록 C — 암묵 변환 요약부록 D — 표준 라이브러리 요람부록 E — 문법을 적는 법(EBNF)과 C 문법 전문부록 F — C23이 보탠 것과 이 책에서의 자리부록 G — 프로그램이 죽은 뒤에: 덤프를 읽는 법부록 H — OS 없이 도는 C: 인터럽트와 그 기계부록 I — 기계는 어떻게 이야기하는가: 선, 버스, 그리고 끼어들기부록 J — 디스크는 어떻게 나뉘어 있는가부록 K — 실행 파일의 형식들부록 L — 기계가 깨어나는 순서: 부팅과 부트로더부록 M — 재어 보는 기계: 수로 만나는 캐시, 분기, 코어부록 N — 기억을 다스리는 장치들부록 O — 다 배웠는데 못 만들겠다면부록 P — 더 읽을거리와 도구, 그리고 표준 문서부록 Q — 표와 그림 목록참고 문헌과 출처찾아보기
저작권과 연락처
본문 — 크리에이티브 커먼즈 저작자표시-비영리-동일조건변경허락 4.0 국제 라이선스(CC BY-NC-SA 4.0). 출처를 밝히면 자유롭게 공유하고 고칠 수 있으나, 영리 목적 이용은 허용되지 않으며, 고친 결과물에는 같은 라이선스를 적용해야 합니다.
creativecommons.org/licenses/by-nc-sa/4.0/
예제 코드 — MIT 라이선스. 자유롭게 가져다 쓰실 수 있습니다. 예제에서 사용한 proven 라이브러리는 그 자체의 라이선스(현재는 MIT 라이선스)를 따릅니다.
이 책의 모든 코드 시연은 실제로 컴파일·실행해 얻은 출력을 그대로 인쇄한 것입니다. 조판은 Typst로 했습니다.
이 책은 계속 고쳐집니다. 지금 읽고 계신 것은 위 번호의 판이고, 그 뒤로도 오류 수정과 내용 보강이 이어집니다. 오류 신고와 수정 제안은 저장소에서 받습니다.