Skip to content
난이도 출제 빈출문제은행 6

제어문과 반복문 ​

제어문(control statement)은 코드가 위에서 아래로 한 줄씩 흐르는 순서를 바꾸는 문장이다. 조건에 따라 갈라지는 선택문과 같은 일을 되풀이하는 반복문이 있다. 출력 문제에서는 switch의 break 누락, 반복 횟수의 경계값, break와 continue의 차이, do-while의 첫 실행이 결과를 가른다. C와 Java의 문법이 거의 같아서 한 번에 익힌다.

선택문: if와 switch ​

if는 조건식이 참(C에서는 0이 아닌 값)일 때 블록을 실행하고, else if로 조건을 차례대로 검사한다. 위에서 처음 참이 된 한 곳만 실행하고 나머지는 건너뛴다.

switch는 값 하나를 여러 case와 비교해 일치한 case부터 실행을 시작한다. 여기서 중요한 점은 break를 만날 때까지 아래 case들도 이어서 실행된다는 것이다. 이를 폴스루(fall-through)라 한다. 일부러 여러 case를 한 처리로 묶을 때 쓰지만, 시험에서는 break를 빠뜨린 코드의 합계를 묻는 함정으로 나온다. 어느 case와도 맞지 않으면 default로 간다. switch (score / 10)처럼 정수 나눗셈(integer division)으로 점수 구간을 case 값 하나로 줄이는 코드도 자주 나온다. 87 / 10은 8이므로 case 8:로 간다.

반복문 세 가지 ​

문장조건 검사 시점최소 실행 횟수
for (초기; 조건; 증감)매 반복 전0회
while (조건)매 반복 전0회
do { } while (조건);매 반복 후1회

for는 초기식을 한 번 실행하고, 조건 검사 → 본문 → 증감식 순서를 반복한다. 반복 횟수는 i = 1; i <= 10이면 10회, i = 0; i < 10이면 10회처럼 경계에서 자주 틀리므로 첫 값과 마지막 값을 직접 적어 본다. do-while은 본문을 먼저 실행하고 조건을 나중에 보므로, 조건이 처음부터 거짓이어도 한 번은 돈다.

c
int i = 5, a = 0, b = 0;
while (i < 5) { a++; i++; }      // 조건이 처음부터 거짓 → 0회
i = 5;
do { b++; i++; } while (i < 5);  // 본문 먼저 → 1회
printf("%d %d\n", a, b);         // 0 1

Java에는 향상된 for(enhanced for) for (int v : arr)도 있다. 배열의 원소를 앞에서부터 하나씩 꺼내 v에 담아 원소 개수만큼 반복한다. v는 인덱스(index)가 아니라 원소 값이라는 점에서 자주 틀린다. Java 배열은 new int[5]처럼 만들면 원소가 기본값(정수 0, 참조형(reference type) null)으로 채워진다. 개수를 셀 때 배열은 필드(field) arr.length, 문자열은 메서드(method) str.length()를 쓰고, str.charAt(i)는 0부터 센 i번째 문자를 돌려준다.

break와 continue ​

break는 자신을 감싼 가장 안쪽 반복문이나 switch를 즉시 빠져나간다. 반복이 이중으로 겹쳐 있으면 안쪽만 끝나고 바깥 반복은 계속된다. continue는 이번 회차의 남은 본문을 건너뛰고 다음 회차로 간다. for에서 continue를 만나도 증감식은 실행된다는 점이 while과 다르다. while에서 증감을 continue 아래에 두면 무한 반복에 빠질 수 있다.

c
int sum = 0;
for (int i = 1; i <= 10; i++) {
    if (i % 3 == 0) continue;   // 3, 6 건너뜀
    if (i > 7) break;           // 8에서 종료
    sum += i;                   // 1+2+4+5+7
}
printf("%d\n", sum);            // 19

추적할 때는 표를 그려 변수의 값을 회차별로 적으면 실수가 줄어든다. 조건 검사 결과와 break·continue가 걸린 회차를 따로 표시해 둔다.

시험 포인트 ​

  • switch에서 break가 없으면 일치한 case 아래를 break나 끝까지 계속 실행한다(fall-through).
  • 조건을 나중에 검사해 최소 1회 실행되는 반복문 → do-while.
  • break는 가장 안쪽 반복만 탈출, continue는 다음 회차로(for는 증감식 실행).
  • for (i = 0; i < n; i++)의 반복 횟수는 n, 끝난 뒤 i 값도 n이다.
  • Java 향상된 for의 변수는 원소 값. 배열 길이는 length, 문자열 길이는 length().

관련 문서