2What — 제어 흐름이란?
3- 제어 흐름(Control Flow)은 프로그램이 명령문을 실행하는 순서를 결정하는 메커니즘이다
4- 기본적으로 코드는 위에서 아래로 한 줄씩 실행된다 — 이것을 순차 실행(Sequential Execution)이라 한다
5- 제어 흐름 구문을 사용하면 이 순서를 분기(Branch)하거나 반복(Loop)할 수 있다
6- C에서 제공하는 제어 흐름 도구: \texttt{if}, \texttt{else}, \texttt{switch}, \texttt{for}, \texttt{while}, \texttt{do-while}, \texttt{goto}
7Why — 제어 흐름이 없으면 프로그램은 계산기에 불과하다
8- 순차 실행만으로는 "조건에 따라 다르게 동작"하는 프로그램을 만들 수 없다
9- Böhm & Jacopini(1966)는 모든 계산 가능한 알고리즘이 순차, 선택, 반복 세 가지 구조만으로 표현 가능함을 증명했다
10- 즉, 제어 흐름은 프로그래밍의 표현력 자체를 결정하는 근본 요소이다
11실생활 비유 — 요리 레시피
12- 순차: "계란을 깨고 → 저어라 → 프라이팬에 부어라"
13- 분기: "소금이 있으면 → 넣어라, 없으면 → 건너뛰어라" (\texttt{if-else})
14- 반복: "거품이 날 때까지 → 계속 저어라" (\texttt{while})
15- 이 세 가지 없이는 레시피도, 프로그램도 현실적인 문제를 다룰 수 없다
16Why — C에서 제어 흐름이 특히 중요한 이유
17- C는 하드웨어에 가까운 언어이므로, 제어 흐름이 CPU의 분기 명령어(branch instruction)에 직접 대응된다
18- Python의 \texttt{for x in list}와 달리, C의 \texttt{for}는 초기화·조건·증감을 프로그래머가 직접 명시한다
19- 이 명시성 덕분에 임베디드 시스템, OS 커널 등에서 정확한 실행 흐름 제어가 가능하다 (Kernighan & Ritchie, 1988)
20- 반면, 실수하면 무한 루프, off-by-one 에러, 도달 불가 코드(dead code) 같은 버그가 발생한다
21How — 제어 흐름의 세 가지 범주
22- 1. 선택(Selection): 조건에 따라 실행 경로를 나눈다
23 - \texttt{if} / \texttt{else if} / \texttt{else}: 불리언 조건 기반 분기
24 - \texttt{switch}: 정수/문자 값에 따른 다중 분기 (점프 테이블로 최적화 가능)
25- 2. 반복(Iteration): 조건이 참인 동안 코드 블록을 재실행한다
26 - \texttt{for}: 횟수가 정해진 반복에 적합
27 - \texttt{while}: 조건이 먼저 검사됨 — 0회 실행 가능
28 - \texttt{do-while}: 본문이 먼저 실행됨 — 최소 1회 보장
29- 3. 점프(Jump): 실행 흐름을 강제로 이동시킨다
30 - \texttt{break}: 루프/switch 탈출
31 - \texttt{continue}: 현재 반복 건너뛰기
32 - \texttt{goto}: 임의 위치로 점프 — Dijkstra(1968)의 "Go To Statement Considered Harmful" 이후 사용 자제가 원칙이나, Linux 커널에서는 에러 처리 패턴에 여전히 활용
33핵심 정리
34- 순차 → "무엇을 하는가"
35- 선택 → "언제 하는가"
36- 반복 → "몇 번 하는가"
37- 이 세 가지가 합쳐져야 비로소 튜링 완전(Turing Complete)한 프로그램이 된다 (Böhm & Jacopini, 1966)