반복문
제어문과 반복문
프로그램은 기본적으로 위에서 아래로 순차적으로 실행된다. 하지만 때로는 특정 규칙을 가진 처리를 반복해야 할 필요가 있는데, 이때 사용하는 구문이 바로 Loop(반복문)이다. Loop는 프로그램의 흐름을 제어하는 Control Statement(제어문)의 한 종류이다.
반복문의 종류
C언어에서 제공하는 주요 Loop는 다음과 같다.
구문 | 특징 |
---|---|
for | 정해진 횟수만큼 반복하는 경우에 적합하다. |
while | 구문이 간단하며, 조건을 먼저 검사한다. |
do while | 조건을 나중에 검사하여 몸체를 최소 한 번은 실행한다. |
for
문
for
문은 일정한 횟수를 반복하는 로직에 매우 유용하다.
for
문 구조
for
문은 for
키워드와 그 뒤를 따르는 괄호 ()
로 구성된다. 괄호 안에는 세미콜론(;
)으로 구분되는 세 가지 주요 부분이 있다.
- Initialization(초기화): 반복문을 시작하기 전 한 번만 실행되며, 주로 반복 횟수를 세는 변수를 초기화한다.
- Conditional Expression(조건검사): 반복을 계속할지 결정하는 조건식이다. 이 식이 참(true)인 동안 반복이 계속된다.
- Increment/Decrement(증감연산): 반복문의 Body(몸체)가 한 번 실행된 후에 실행되며, 주로 초기화 단계에서 선언한 변수의 값을 증가시키거나 감소시킨다.
for (초기식; 조건식; 증감식) {
// 반복할 문장 (for문의 몸체)
statement;
}
만약 Body에 문장이 하나만 있다면 중괄호 {}
는 생략할 수 있다.
for
문 실행 순서
for
문의 실행 흐름은 다음과 같다.
- 초기화 식이 실행된다.
- 조건검사 식이 평가된다.
- 조건이 참이면 다음을 수행한다.
for
문의 Body가 실행된다.- 증감연산식이 실행된다.
- 다시 2단계(조건검사)로 돌아간다.
- 조건이 거짓이면
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까지 변하는 동안 sum
에 i
의 값을 계속 더해, 최종적으로 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 안에서
mult
에i
를 곱하고,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"); // 한 단이 끝나면 줄바꿈
}
break
와 continue
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