C언어 제어문과 반복문 한 번에 정리
프로그램은 본질적으로 위에서 아래로 순차 실행되지만, 그것만으로는 의미 있는 일을 거의 할 수 없다. 어떤 조건에서는 다른 길로 갈라지고, 어떤 조건에서는 같은 작업을 여러 번 반복해야 비로소 알고리즘이 완성된다. 이러한 흐름을 제어하기 위해 C언어가 제공하는 두 가지 도구가 바로 제어문(Control Statement)과 반복문(Loop)이다. 입문자가 가장 먼저 익혀야 할 핵심 문법이며, 이 두 도구를 자유자재로 사용할 수 있어야 변수와 데이터 타입을 다루는 능력이 비로소 살아 움직이는 프로그램으로 변환된다. 본 글은 조건문, 반복문, 그리고 분기를 제어하는 키워드까지 한 번에 정리한다.

조건문, if와 switch의 활용
조건문은 특정 조건의 참·거짓에 따라 코드의 실행 경로를 분기시키는 문법이다. C언어에서 사용되는 조건문은 크게 if 계열과 switch 계열로 나뉘며, 각각이 적합한 상황이 분명히 구분된다. 조건이 단순한 참·거짓 분기이거나 비교 연산이 필요한 경우에는 if 문이 적합하고, 한 변수의 여러 가지 값에 따라 분기해야 하는 경우에는 switch 문이 더 효율적이다.
if 문은 가장 기본적인 조건문으로 "if (조건) { 실행할 코드 }" 형식으로 작성한다. 조건이 참이면 중괄호 안의 코드가 실행되고, 거짓이면 건너뛴다. 양자택일이 필요하면 else 절을 추가해 "if (조건) { ... } else { ... }" 형식으로 작성한다. 셋 이상의 분기가 필요할 때는 else if를 활용해 다중 조건을 만든다. 이때 조건은 위에서부터 순서대로 평가되며, 처음으로 참이 되는 분기만 실행되고 나머지는 모두 건너뛴다는 점에 주의해야 한다. 조건이 단순할 때는 삼항 연산자 "조건 ? 참값 : 거짓값" 형식을 사용해 한 줄로 표현할 수 있으며, 변수 할당이나 함수 인자 등 식 안에서 분기가 필요할 때 매우 유용하다.
switch 문은 한 변수가 여러 개의 특정 값 중 어떤 것과 같은지를 검사할 때 사용한다. "switch (변수) { case 값1: 코드1; break; case 값2: 코드2; break; default: 기본 코드; }" 형식으로 작성하며, 각 case 끝에 반드시 break를 명시해야 한다. break를 빠뜨리면 해당 case 이후의 모든 case가 연쇄적으로 실행되는 fall-through가 발생하기 때문이다. 이 동작은 의도적으로 활용할 수도 있지만 대부분의 경우 버그의 원인이 되므로 주의가 필요하다. 모든 case에 해당하지 않을 때 실행되는 default 절은 누락되어도 문제 없지만, 예외 처리를 위해 항상 포함하는 것이 권장된다. 다만 switch 문은 정수형이나 문자형 같은 이산적인 값에만 사용할 수 있으며, 실수형이나 문자열 비교에는 사용할 수 없다는 제약이 있다.
반복문, for와 while의 차이
반복문은 같은 코드를 여러 번 실행하기 위한 문법이며, C언어는 세 가지 형태의 반복문을 제공한다. for 문, while 문, do-while 문이 그것이며, 세 가지 모두 본질적으로는 같은 일을 하지만 어떤 상황에 어떤 반복문을 쓰느냐가 코드의 가독성과 유지보수성에 큰 영향을 미친다. 사용 시점을 구분하는 기준은 반복 횟수가 사전에 정해져 있는지, 그리고 조건 검사가 실행 전에 이루어지는지 후에 이루어지는지이다.
for 문은 반복 횟수가 사전에 정해진 경우에 가장 자주 사용된다. "for (초기식; 조건식; 증감식) { 반복할 코드 }" 형식으로 작성하며, 초기식은 반복 시작 전에 한 번만 실행되고, 조건식은 매 반복 시작 시에 검사되어 참이면 반복을 계속하고 거짓이면 종료한다. 증감식은 매 반복 끝에 실행된다. 가장 흔한 형태가 "for (int i = 0; i < n; i++)"로, 0부터 n-1까지 n번 반복하는 패턴이다. for 문의 강점은 반복을 제어하는 모든 요소가 한 줄에 모여 있어 가독성이 매우 높다는 점이며, 배열을 순회하거나 정해진 횟수만큼 작업을 수행할 때 가장 적합하다.
while 문은 반복 횟수가 미리 정해지지 않고 조건에 따라 결정되는 경우에 사용한다. "while (조건식) { 반복할 코드 }" 형식이며, 조건식이 참인 동안에만 반복을 수행한다. 조건이 처음부터 거짓이면 단 한 번도 실행되지 않을 수 있다는 점이 특징이다. 사용자 입력을 받아 특정 값이 들어올 때까지 반복하거나, 파일의 끝까지 읽어 들이는 작업에 자주 활용된다. while (1) 또는 while (true) 형식은 무한 루프를 만들 때 사용되며, 내부에서 break나 return으로 빠져나오는 패턴이 흔하다.
do-while 문은 while 문과 거의 동일하지만 결정적인 차이가 있다. "do { 반복할 코드 } while (조건식);" 형식으로 작성하며, 조건 검사가 코드 블록 실행 후에 이루어진다는 점이다. 따라서 do-while 문은 조건과 무관하게 최소 한 번은 반드시 실행된다는 강력한 보장을 제공한다. 메뉴 표시처럼 적어도 한 번은 무조건 보여줘야 하는 작업이나, 사용자 입력을 받은 뒤 유효성을 검증해 잘못되면 다시 받는 패턴에 적합하다. 마지막에 세미콜론을 빠뜨리지 않아야 한다는 점이 자주 실수하는 부분이다. 세 반복문은 어느 하나가 우월한 것이 아니며, 상황에 맞춰 가장 자연스러운 표현을 선택하는 것이 좋은 코드의 첫걸음이다.
분기 제어, break와 continue, goto
반복문 내부에서 흐름을 세밀하게 조절하기 위해 사용하는 키워드가 분기 제어문이다. C언어에서 자주 사용되는 분기 제어 키워드는 break, continue, return, 그리고 goto 네 가지이며, 시험과 실무 모두에서 자주 등장하는 핵심 문법이다. 각 키워드의 동작 방식을 정확히 구분해 두는 것이 중요하다.
break는 가장 강력한 분기 제어 키워드로, 만나는 즉시 가장 가까운 반복문이나 switch 문을 즉시 빠져나간다. 반복문이 중첩되어 있다면 가장 안쪽 반복문 하나만 종료되며, 바깥쪽 반복문은 그대로 진행된다. 무한 루프에서 특정 조건이 만족될 때 종료하거나, 검색 작업에서 원하는 값을 찾자마자 반복을 멈추는 용도로 폭넓게 활용된다. switch 문에서 각 case 끝에 break를 두는 이유도 fall-through를 막기 위한 동일한 메커니즘이다.
continue는 break보다 약한 형태의 분기 제어로, 반복문을 종료하는 대신 현재 반복의 남은 코드를 건너뛰고 다음 반복으로 넘어간다. 즉 반복은 계속되지만 특정 조건의 데이터에 대해서는 처리를 생략하고 싶을 때 사용한다. 예를 들어 1부터 100까지의 수 중 짝수만 출력하는 반복문에서, 홀수일 경우 continue를 만나면 출력 코드를 건너뛰고 다음 수로 넘어가는 식이다. break는 반복을 끝내고, continue는 그 회차만 건너뛴다는 차이를 정확히 기억해야 한다.
return은 반복문이나 함수 본체 어디에서든 함수 자체를 즉시 종료하고 호출자에게 값을 반환한다. 함수 안에 있는 반복문에서 return을 만나면 break처럼 반복을 빠져나가는 것이 아니라 함수 전체가 종료된다는 점이 결정적인 차이이다. goto는 라벨이 붙은 위치로 무조건 점프하는 키워드로, "goto 라벨;" 형식으로 사용하며 점프 대상에는 "라벨:"을 붙여 표시한다. goto는 코드의 흐름을 예측하기 어렵게 만들어 가독성과 유지보수성을 크게 떨어뜨리기 때문에 일반적으로 사용을 자제하는 것이 권장된다. 다만 깊게 중첩된 반복문에서 한 번에 모든 반복을 빠져나갈 때나, 에러 처리 후 자원 해제로 점프해야 할 때 같은 매우 제한적인 상황에서만 신중하게 사용하는 것이 표준이다. 이 네 가지 분기 제어 키워드를 적절히 조합하면 어떤 복잡한 흐름도 명확하게 표현할 수 있으며, 좋은 C언어 프로그래머는 키워드 선택만으로도 코드의 의도를 명확히 드러낼 줄 아는 사람이라 할 수 있다.
메타 디스크립션: C언어의 핵심 흐름 제어 도구인 조건문(if·switch), 반복문(for·while·do-while), 그리고 분기 제어 키워드(break·continue·return·goto)의 사용법과 차이를 입문자 관점에서 정리합니다.