5. 반복문
일정 조건을 만족하는 동안 같은 실행문을 반복하는 게 반복문이다.
반복문에는 항상 반복의 조건을 정의하는 조건식과 조건을 만족했을 때 실행하는 문장이 있으며,
조건식의 위치에 따라 크게 3가지 반복문으로 구분할 수 있다.
while (조건식) for (초기식; 조건식; 증감식) do
{ { {
실행문; 실행문; 실행문;
} } }while(조건식);
while문
while문은 조건식을 먼저 검사하고 조건식이 참인 동안 실행문을 반복한다.
예제로 알아보자.
#include <stdio.h>
int main(void)
{
int a = 1; //변수를 선언하고 곱셈을 하기 위해 1로 초기화
while(a < 10) //a가 10보다 작으므로 조건식은 참
{
a = a * 2; //a에 2를 곱해 다시 저장
}
printf("a : %d\n", a); //a값 출력
return 0;
}
while문을 반복하며 a < 10. 즉, a = 8인 값이 들어가 a = 16 값이 나온다.
중괄호의 사용법과 들여쓰기
모든 반복문은 실행문을 중괄호로 묶어 반복할 부분을 표시한다.
만약 실행문이 한 문장이면 중괄호를 생략할 수 있다.
for문
while문과 비슷하게 for문도 반복문이다. 다만 for문은 실행문을 원하는 횟수만큼 반복할 때 사용한다.
예제로 알아보자.
#include <stdio.h>
int main(void)
{
int a = 1; //변수를 선언하고 1로 초기화
int i; //반복 횟수를 세기 위한 변수
for(i = 0; i < 3; i++) //i는 0으로 초기화된 후에 3보다 작은 동안(i < 3)
{ //하나씩 증가하면서(i++)
a = a * 2; //실행문을 실행
}
printf("a : %d\n", a); //for문을 빠져나오면 a값 출력
return 0;
}
초기식(i = 0;)은 한 번만 실행된다. 조건식(i < 3;)이 참이면 반복할 문장 실행 (a = a * 2)
반복할 문장 실행 후 증감식으로 올라간다(i++). i를 1 증가시키고 다시 조건 검사.
이를 반복하며 i < 3인동안 반복된다.
for문 사용 시 주의점
1. 초기식, 조건식, 증감식은 반복 횟수를 알기 쉽게 작성한다.
2. 반복 횟수를 세는 변수를 반복문 안에서 바꾸지 않는 것이 좋다.
do ~ while문
while문, for문은 조건식을 먼저 학인하는 반면 do ~ while문은 일단 반복할 문장을 수행한 후에 조건식을 검사한다.
예제를 통해 알아보자.
#include <stdio.h>
int main(void)
{
int a = 1; //변수를 선언하고 1로 초기화
do //반복문 시작 위치
{
a = a * 2; //a의 값을 2배로 늘린다.
} while(a < 10); //a가 10보다 작으면 a = a *2를 반복
printf("a : %d\n", a); //반복이 끝나면 a값 출력
return 0;
}
int a = 1;로 a를 1로 초기화한 후 반복문을 시작한다.
1, 2, 4, 8일 때 반복할 문장을 실행하고 마지막 실행한 후에 a가 16이 되면서 반복을 끝낸다.
중첩 반복문
중첩 반복문은 반복문 안에 실행할 문장으로 반복문이 포함된 것이다.
별 그리기 예제로 알아보자.
#include <stdio.h>
int main(void)
{
int i, j; //반복 횟수를 세기 위한 제어 변수
for(i = 0; i < 3; i++) //i가 0부터 2까지 증가하면서 3번 반복
{
for(j = 0; j < 5; j++) //j가 0부터 4까지 증가하면서 5번 반복
{
printf("*"); //별 출력문
}
printf("\n"); //별을 5번 출력한 후에 줄을 바꾼다.
}
return 0;
}
i = 0;일 때, *이 5개 출력되고 printf(\n);에 의해서 줄 바꿈이 된다.
i = 1;이 되고 다시 *이 5개 출력되고 printf(\n);에 의해 줄바꿈이 된다.
마지막으로 i < 3이기에 i = 2;를 마지막으로 *이 출력되고 반복문은 끝이 난다.
break와 continue 분기문
break는 반복문 안에서 반복을 즉시 끝낼 때 사용된다.
예제를 통해 break의 사용법을 알아보자.
#include <stdio.h>
int main(void)
{
int i; //반복 횟수를 세기 위한 제어 변수
int sum = 0; //1부터 10까지의 합을 누적할 변수
for(i = 1; i <= 10; i++) //1부터 10까지의 합을 누적할 변수
{
sum += i; //i값을 sum에 누적
if (sum > 30) //누적한 값이 30보다 크면 반복문을 끝낸다.
break;
}
printf("누적한 값 : %d\n", sum);
printf("마지막으로 더한 값 : %d\n", i);
return 0;
}
만약 if(sum < 30)이 없었다면 1~10을 전부 더한 값이 나왔을 것이다. if break를 사용해 for문 하나만 탈출했다.
while(조건식)
{
....
if(조건식)
{
....
break;
}
}
만약 위처럼 for문 없이 진행된다면 반복문 블록 전체를 탈출한다.
그러나 switch ~ case문의 블록 안에서 break를 사용하면 switch ~ case 블록만 벗어난다.
continue
continue는 반복문의 일부를 건너뛴다.
예를 들어 3의 배수를 빼고 1부터 100까지의 합을 구할 때 효과적으로 사용할 수 있다.
for(i = 1; i <= 100; i++)
{
if((i % 3) == 0)
{
continue;
}
sum += i;
}
i가 3의 배수면 sum += i 문장을 건너뛰고 블록 끝으로 간 후에 다시 반복합니다.
for문과 달리 while문에서 continue를 사용하면 다음 실행위치가 조건식이 된다.
i = 1;
while(i <= 100)
{
if((i % 3) == 0)
{
continue;
}
sum += i;
i++
}
위 코드에서는 i가 3일 때 증감식 i++를 건너뛰므로 while문의 조건식은 계속 참이 된다.
즉, 무한 반복을 한다.
반복문은 이것으로 마무리하겠다.