Skip to main content

반복문

제어문과 반복문

프로그램은 기본적으로 위에서 아래로 순차적으로 실행된다. 하지만 때로는 특정 규칙을 가진 처리를 반복해야 할 필요가 있는데, 이때 사용하는 구문이 바로 Loop(반복문)이다. Loop는 프로그램의 흐름을 제어하는 Control Statement(제어문)의 한 종류이다.

반복문의 종류

C언어에서 제공하는 주요 Loop는 다음과 같다.

구문특징
for정해진 횟수만큼 반복하는 경우에 적합하다.
while구문이 간단하며, 조건을 먼저 검사한다.
do while조건을 나중에 검사하여 몸체를 최소 한 번은 실행한다.

for

for 문은 일정한 횟수를 반복하는 로직에 매우 유용하다.

for 문 구조

for 문은 for 키워드와 그 뒤를 따르는 괄호 ()로 구성된다. 괄호 안에는 세미콜론(;)으로 구분되는 세 가지 주요 부분이 있다.

  1. Initialization(초기화): 반복문을 시작하기 전 한 번만 실행되며, 주로 반복 횟수를 세는 변수를 초기화한다.
  2. Conditional Expression(조건검사): 반복을 계속할지 결정하는 조건식이다. 이 식이 참(true)인 동안 반복이 계속된다.
  3. Increment/Decrement(증감연산): 반복문의 Body(몸체)가 한 번 실행된 후에 실행되며, 주로 초기화 단계에서 선언한 변수의 값을 증가시키거나 감소시킨다.
for (초기식; 조건식; 증감식) {
// 반복할 문장 (for문의 몸체)
statement;
}

만약 Body에 문장이 하나만 있다면 중괄호 {}는 생략할 수 있다.

for 문 실행 순서

for 문의 실행 흐름은 다음과 같다.

  1. 초기화 식이 실행된다.
  2. 조건검사 식이 평가된다.
  3. 조건이 참이면 다음을 수행한다.
    1. for 문의 Body가 실행된다.
    2. 증감연산식이 실행된다.
    3. 다시 2단계(조건검사)로 돌아간다.
  4. 조건이 거짓이면 for 문을 종료하고 다음 문장으로 넘어간다.

1부터 10까지의 모든 정수를 더하는 예제는 다음과 같이 for 문으로 작성할 수 있다.

  • 결과를 저장할 변수 sum을 0으로 초기화한다.
  • 반복 횟수를 제어할 변수 i를 1로 초기화한다.
  • i가 10보다 작거나 같을 때까지 반복하도록 조건을 설정한다.
  • 한 번 반복할 때마다 i의 값을 1씩 증가시킨다.
int sum = 0;
int i;

for (i = 1; i <= 10; i++) {
sum += i; // sum = sum + i; 와 동일
}

이 코드는 i가 1부터 10까지 변하는 동안 sumi의 값을 계속 더해, 최종적으로 55라는 결과를 sum에 저장한다.


while

while 문은 for 문보다 구조가 간단하며, 특정 조건이 만족되는 동안 계속해서 Body를 반복 실행한다.

while 문 구조

while 문은 while 키워드와 조건검사 식으로 이루어진 괄호 ()로 구성된다. 조건이 참이면 Body를 실행하고, 다시 조건을 검사한다. 이 과정은 조건이 거짓이 될 때까지 반복된다.

while (expression) {
// 반복할 문장 (while문의 몸체)
statement;
}

while 문은 조건을 먼저 검사하므로, 처음부터 조건이 거짓이면 Body는 한 번도 실행되지 않을 수 있다.

1부터 10까지의 모든 정수를 곱하는 예제는 다음과 같다.

  • 결과를 저장할 변수 mult를 1로 초기화한다.
  • 반복을 제어할 변수 i를 1로 초기화한다.
  • i가 10 이하인 동안 Body를 반복한다.
  • Body 안에서 multi를 곱하고, i의 값을 1 증가시킨다.
long long mult = 1;
int i = 1;

while (i <= 10) {
mult *= i;
i++;
}

do while

do while 문은 while 문과 유사하지만, 조건을 Body 실행 에 검사한다는 점에서 중요한 차이가 있다.

do while 문 구조

do while 문은 do 키워드로 시작하여 Body를 실행한 후, while과 조건검사 식으로 반복 여부를 결정한다. 이 구조 때문에 Body는 최소 한 번은 실행되는 것이 보장된다.

do {
// 반복할 문장 (do while문의 몸체)
statement;
} while (expression);

주의할 점은 while (expression) 뒤에 반드시 세미콜론(;)을 붙여야 한다는 것이다.

입력받은 정수의 자릿수를 반대로 출력하는 예제이다. 예를 들어, 125가 입력되면 521을 출력한다.

  • 나머지 연산자 %를 사용하여 가장 오른쪽 자릿수를 구한다. (125 % 10 -> 5)
  • 나눗셈 연산자 /를 사용하여 가장 오른쪽 자릿수를 제거한다. (125 / 10 -> 12)
  • 이 과정을 원래 값이 0이 될 때까지 반복한다.
int value; // 사용자로부터 입력받은 정수
int r_digit;

// ... scanf로 value 입력받는 부분 ...

do {
r_digit = value % 10;
printf("%d", r_digit);
value = value / 10;
} while (value != 0);

기타 제어문 및 개념

반복문을 더 효과적으로 사용하기 위한 몇 가지 추가적인 개념이 있다.

무한 반복 (Infinite Loop)

반복문의 조건이 항상 참으로 평가되어 영원히 종료되지 않는 Loop를 Infinite Loop(무한 반복)이라고 한다.

  • for 문에서는 조건식을 비워두면 Infinite Loop가 된다.

    for (;;) {
    // 무한 반복
    }
  • while 문에서는 조건식에 참을 의미하는 값(예: 1)을 넣어 Infinite Loop를 만든다. 조건식을 비우는 것은 문법 오류이다.

    while (1) {
    // 무한 반복
    }

중첩 반복문 (Nested Loop)

하나의 Loop 내부에 다른 Loop가 포함된 구조를 Nested Loop(중첩 반복문)이라고 한다. 바깥쪽 Loop가 한 번 실행될 때 안쪽 Loop는 전체가 실행된다. 구구단이나 별 찍기 패턴 등을 구현할 때 유용하다.

// i가 1부터 9까지 변하는 동안
for (int i = 1; i <= 9; i++) {
// j가 1부터 9까지 변함
for (int j = 1; j <= 9; j++) {
printf("%d * %d = %d\n", i, j, i * j);
}
printf("\n"); // 한 단이 끝나면 줄바꿈
}

breakcontinue

  • break: break 문을 만나면 현재 실행 중인 Loop를 즉시 종료하고 Loop 다음 문장으로 제어를 넘긴다. 주로 Infinite Loop와 함께 특정 조건에서 탈출할 때 사용된다.
  • continue: continue 문을 만나면 현재 반복의 나머지 부분을 건너뛰고 즉시 다음 반복을 시작한다. (for 문의 경우 증감연산 식으로 이동)
for (int i = 1; i <= 10; i++) {
if (i % 2 == 0) {
continue; // i가 짝수이면 출력을 건너뛴다.
}
if (i > 7) {
break; // i가 7보다 커지면 반복을 중단한다.
}
printf("%d ", i);
}
// 출력 결과: 1 3 5 7