기본 콘텐츠로 건너뛰기

방송대 방통대 C프로그래밍 5강 - 선택 제어문과 반복 제어문 - 요약 노트 시험족보 예상문제 - 올에이클래스

C프로그래밍 5강 - 선택 제어문과 반복 제어문

C프로그래밍 5강 - 선택 제어문과 반복 제어문

C 프로그램의 순차·선택·반복 흐름을 이해하고 if와 switch를 이용한 조건 분기 방법을 학습한다. for, while, do-while 반복문의 실행 순서를 비교하고 break, continue, goto가 제어 흐름을 바꾸는 방식을 정리한다.

1. C 언어의 문장과 흐름 제어

문장의 의미

문장(statement)은 선언이나 실행을 지시하는 표현의 기본 단위이다. int a;처럼 자료형과 변수를 선언하는 선언문과 a += 10;처럼 동작 수행을 지시하는 실행문으로 나뉜다. 실행문은 함수 안에만 작성할 수 있다.

문장은 세미콜론으로 끝을 표시하고 실행문은 기본적으로 나열된 순서에 따라 순차 실행된다. 흐름 제어문을 사용하면 이 순차적인 흐름을 조건에 따라 나누거나 같은 처리를 반복할 수 있다.

구조실행 방식대표 문장
순차 제어문장을 나열된 순서대로 실행일반 선언문과 실행문
선택 제어조건에 따라 실행 경로를 선택if, switch
반복 제어조건에 따라 같은 처리를 반복for, while, do-while

블록

블록(block, 복합문)은 하나 이상의 문장을 중괄호로 묶어 하나의 문장처럼 취급한 것이다. 블록 안에는 지역변수를 선언할 수 있다. 닫는 중괄호가 블록의 끝을 표시하므로 중괄호 뒤에 세미콜론을 붙일 필요가 없다.

2. 단순 if 문과 if-else 문

단순 if 문

선택 제어문은 지정된 조건에 따라 특정 실행 경로를 선택하는 분기 구조이다. 단순 if 문은 조건식이 참일 때만 지정한 문장 또는 블록을 실행하고, 거짓이면 이를 건너뛴 뒤 if 다음 문장으로 진행한다.

if (조건식)
    문장;
다음 문장;

두 정수 a와 b를 큰 값부터 정렬하려면 if (a < b)가 참일 때 임시변수를 사용하여 두 값을 교환할 수 있다. 여러 문장을 조건부로 실행해야 하므로 교환 과정 전체를 중괄호 블록으로 묶는다.

if-else 문

if-else 문은 조건이 참이면 if 뒤의 문장을, 거짓이면 else 뒤의 문장을 실행한다. 두 경로 중 하나만 실행한 뒤 공통된 다음 문장으로 흐름이 합쳐진다.

if (a >= b)
    max = a;
else
    max = b;

if가 제어하는 문장은 기본적으로 한 문장이다. 조건에 따라 여러 문장을 함께 실행하려면 반드시 중괄호로 블록을 만들어야 한다.

3. 다중 if 문과 else-if 연쇄

중첩 if와 else의 결합

if 문 안에 다른 if 문을 넣으면 조건을 단계적으로 검사할 수 있다. C에서 else는 중괄호로 따로 범위를 지정하지 않는 한 가장 가까운 짝이 없는 if와 결합한다.

if (a >= 0)
    if (a == 0)
        printf("입력된 값은 0\n");
    else
        printf("입력된 값은 양수\n");
else
    printf("입력된 값은 음수\n");

안쪽 else는 if (a == 0)과 짝을 이루고, 마지막 else는 바깥쪽 if (a >= 0)과 짝을 이룬다. 구조가 복잡할 때에는 중괄호를 사용하여 의도한 결합을 분명하게 표시해야 한다.

else-if 연쇄

여러 조건 중 하나를 선택하려면 if - else if - else 구조를 사용한다. 위에서부터 조건을 차례로 검사하고 처음 참이 된 문장만 실행한 뒤 전체 연쇄를 빠져나온다.

학점 계산에서 90점 이상은 A, 80점 이상은 B, 70점 이상은 C, 60점 이상은 D, 나머지는 F로 분류한다. 85점은 첫 조건은 거짓이고 두 번째 조건이 참이므로 B만 출력한다.

else-if 조건은 순서가 중요하다. 학점처럼 범위가 겹치는 조건은 큰 기준부터 내려가며 검사해야 올바른 한 구간을 선택할 수 있다.

4. switch 문

switch의 구조

switch 문은 지정된 식의 값에 따라 일치하는 case 레이블의 문장부터 실행한다. switch의 식은 char, short, int, long, long long, 열거형 등 정수 유형이어야 하고, case 레이블은 그 식의 자료형으로 변환할 수 있는 상수여야 한다.

switch (정수형 식) {
case 상수1:
    문장들;
    break;
case 상수2:
    문장들;
    break;
default:
    문장들;
}

break와 관통 실행

일치하는 case를 찾으면 그 위치부터 아래 문장들을 실행한다. break가 없으면 다음 case 레이블을 만나도 실행이 계속된다. 예를 들어 score가 85이고 switch (score / 10)에 break가 없으면 case 8부터 B, C, D, F가 차례로 출력된다.

각 학점을 하나만 출력하려면 case마다 break를 두어 switch 문을 빠져나오게 한다. case 10과 case 9가 같은 A 처리로 이어지게 하려면 case 10에는 문장과 break를 두지 않고 case 9의 A 출력과 break를 함께 사용한다.

switch의 case는 자동으로 한 구간만 실행하는 구조가 아니다. 다음 case로 내려가는 것을 막으려면 명시적으로 break를 사용해야 한다.

5. 반복 제어문의 종류

반복 제어문(loop)은 정해진 조건에 따라 동일한 처리를 반복 실행한다. C의 대표적인 반복문은 for, while, do-while이다.

반복문조건 검사 시점특징
for반복 본문 실행 전초기화·조건·증감을 한곳에 작성하며 반복 횟수가 명확할 때 주로 사용
while반복 본문 실행 전조건이 처음부터 거짓이면 한 번도 실행하지 않을 수 있음
do-while반복 본문 실행 후조건과 관계없이 본문을 최소 한 번 실행

for와 while은 조건을 먼저 검사하는 선검사 반복문이다. do-while은 문장을 먼저 실행하고 조건을 검사하는 후검사 반복문이므로 최소 실행 횟수에서 차이가 난다.

6. for 문과 다중 for 문

for 문의 실행 순서

for 문은 반복 횟수가 명확할 때 주로 사용하며 반복 횟수를 세는 변수를 이용한다.

for (초기식; 조건식; 증감식)
    반복할 문장;

초기식은 반복 시작 전에 한 번 실행한다. 이후 조건식을 검사하여 참이면 본문을 실행하고, 증감식을 수행한 뒤 다시 조건식으로 돌아간다. 조건이 거짓이면 반복을 종료한다.

int i, sum = 0;
for (i = 1; i <= 10; ++i)
    sum = sum + i;

이 예는 i를 1부터 10까지 변화시키며 합을 누적하여 55를 만든다. 마지막 증감으로 i가 11이 된 뒤 조건이 거짓이 되어 종료한다.

다중 for 문

for 문의 반복 본문 안에 다른 for 문이 들어가면 다중 또는 중첩 for 문이 된다. 바깥 루프가 한 번 실행될 때마다 안쪽 루프는 자신의 전체 반복을 수행한다.

바깥 변수 a가 1부터 3까지 세 번 반복하고, 안쪽 변수 b가 0부터 3까지 네 번 반복하면 안쪽 출력은 총 3×4=12회 수행된다.

7. while 문과 do-while 문

while 문

while 문은 지정한 조건이 참인 동안 반복한다. 반복 전에 조건을 검사하므로 초기 조건이 거짓이면 본문을 한 번도 실행하지 않을 수 있다.

while (조건식) {
    반복할 문장;
}

1부터 10까지 합을 구하려면 i=1, sum=0으로 초기화하고, while (i <= 10) 안에서 sum에 i를 더한 뒤 i를 증가시킨다. 반복 변수를 적절히 바꾸지 않으면 조건이 계속 참이 되어 반복이 끝나지 않을 수 있다.

do-while 문

do-while 문은 본문을 먼저 실행한 뒤 조건을 검사한다. 조건이 참이면 다시 본문으로 돌아가므로 반복할 문장을 최소 한 번은 실행한다.

do {
    반복할 문장;
} while (조건식);

do-while 문은 끝의 while (조건식) 뒤에 세미콜론을 붙인다. 강의의 1부터 n까지 합 예에서는 합산과 i 증가를 먼저 수행한 뒤 i <= n을 검사한다.

while은 조건 검사 후 본문, do-while은 본문 실행 후 조건 검사이다. 따라서 do-while만 조건이 처음부터 거짓이어도 본문을 한 번 실행한다.

8. break, continue, goto 문

break 문

break는 switch 문을 끝내거나 for, while, do-while 반복문의 실행을 즉시 중지하고 빠져나온다. 여러 구조가 중첩되어 있으면 break가 포함된 가장 가까운 switch 또는 반복문만 벗어난다.

while (1)로 입력을 계속 받는 프로그램에서 사용자가 0을 입력하면 break로 반복을 끝낼 수 있다. 10, 20, 30, 0을 입력하면 0은 합산하지 않고 반복을 종료하여 합 60을 출력한다.

continue 문

continue는 반복문 자체를 끝내지 않고 현재 반복의 남은 명령만 건너뛴 후 다음 반복을 계속한다. 음수가 입력되면 제곱근 계산 문장을 건너뛰고 다음 입력으로 진행하는 방식으로 활용할 수 있다.

goto 문

goto는 지정된 레이블 위치로 제어를 무조건 옮긴다. goto label;로 이동하고 대상 위치를 label:로 표시한다. goto 명령이 포함되지 않은 블록의 레이블 위치로는 이동할 수 없다.

문장제어 이동
break가장 가까운 switch 또는 반복문 밖으로 이동
continue현재 반복의 나머지를 건너뛰고 다음 반복 재개
goto지정된 레이블로 무조건 이동

핵심 개념 정리

  • C의 일반적인 흐름 제어는 순차, 선택, 반복 구조로 구분된다.
  • 블록은 여러 문장을 중괄호로 묶어 하나의 문장처럼 취급하며 지역변수를 포함할 수 있다.
  • if는 조건의 참·거짓에 따라 문장을 선택하고 else는 가장 가까운 짝 없는 if와 결합한다.
  • else-if 연쇄는 위에서부터 검사하여 처음 참인 한 경로만 실행한다.
  • switch는 정수 유형 식의 값과 일치하는 case부터 실행하며 break가 없으면 다음 case까지 계속 실행한다.
  • for는 반복 횟수가 명확할 때, while과 do-while은 일반 조건에 따른 반복에 사용한다.
  • while은 본문 전에 조건을 검사하고 do-while은 본문 후에 검사하여 최소 한 번 실행한다.
  • break는 switch나 반복문을 빠져나가고 continue는 현재 반복의 나머지만 건너뛴다.
  • goto는 지정한 레이블로 무조건 제어를 옮긴다.

최종 정리: 제어문을 해석할 때에는 조건 검사 시점, 참과 거짓의 이동 경로, 반복 변수의 변화, break와 continue가 도달하는 위치를 순서대로 추적해야 한다. 중첩 구조에서는 중괄호와 가장 가까운 제어문 관계를 먼저 확인한다.

예상문제 20선

1. C 프로그램의 기본 흐름 제어 구조에 해당하지 않는 것은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ①
C의 일반적인 흐름 제어는 순차, 선택, 반복 구조이다.

2. 블록에 대한 설명으로 옳은 것은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ②
블록은 한 개 이상의 문장을 중괄호로 묶으며 지역변수도 포함할 수 있다.

3. 단순 if 문의 조건이 거짓일 때 일어나는 일은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ③
단순 if는 조건이 참일 때만 제어 대상 문장을 실행한다.

4. 중괄호로 범위를 따로 지정하지 않았을 때 else가 결합하는 대상은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ④
else는 문법적으로 가장 가까운 아직 짝이 없는 if와 연결된다.

5. else-if 연쇄에서 여러 조건이 참일 수 있을 때 실행되는 경로는?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ①
조건을 위에서부터 검사하고 첫 참 경로를 실행하면 나머지 연쇄는 건너뛴다.

6. switch 문의 식으로 사용할 수 있는 자료형은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ②
switch 식은 char, short, int, long, long long, 열거형 등의 정수 유형이어야 한다.

7. switch의 일치하는 case 안에 break가 없으면?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ③
case 레이블은 실행을 막지 않으므로 break를 만날 때까지 아래 문장으로 관통한다.

8. 반복 횟수가 명확할 때 주로 사용하는 반복문은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ④
for 문은 반복 카운트의 초기화, 조건, 증감을 모아 작성하므로 횟수가 분명할 때 적합하다.

9. for 문의 실행 순서로 옳은 것은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ①
초기식은 한 번 실행하고, 조건이 참이면 본문과 증감식을 수행한 뒤 조건으로 돌아간다.

10. 1부터 10까지의 합은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ②
강의의 for와 while 예제는 1부터 10까지 차례로 누적하여 55를 출력한다.

11. 바깥 for가 3회, 안쪽 for가 매번 4회 반복되면 안쪽 본문의 총 실행 횟수는?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ③
바깥 반복 한 번마다 안쪽 반복 전체가 수행되므로 3×4=12회이다.

12. 초기 조건이 거짓이면 본문을 한 번도 실행하지 않을 수 있는 반복문은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ④
while은 본문 전에 조건을 검사하므로 처음부터 거짓이면 본문을 실행하지 않는다.

13. 조건이 처음부터 거짓이어도 본문을 최소 한 번 실행하는 반복문은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ①
do-while은 본문을 실행한 뒤 조건을 검사하는 후검사 반복문이다.

14. do-while 문의 올바른 끝부분은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ②
do-while의 마지막 while 조건식 뒤에는 세미콜론을 붙인다.

15. 반복문 안에서 break를 실행하면?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ③
break는 자신을 포함한 가장 가까운 반복문 또는 switch 문을 종료한다.

16. 반복문에서 continue를 실행하면?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ④
continue는 반복 자체를 끝내지 않고 현재 회차의 나머지 문장만 생략한다.

17. while (1)의 일반적인 의미는?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ①
C에서 1은 참이므로 break 등으로 빠져나오기 전까지 반복한다.

18. goto 문의 기능은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ②
goto는 goto label; 형식으로 지정한 label: 위치로 이동한다.

19. 10, 20, 30, 0을 차례로 입력받고 0에서 break하는 합계 프로그램의 결과는?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ③
0을 만나기 전의 10+20+30을 합산하므로 결과는 60이다.

20. while과 do-while의 가장 중요한 차이는?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ④
검사 시점 때문에 do-while은 본문을 최소 한 번 실행하지만 while은 0회 실행할 수 있다.

댓글