3.2 while문

while문 역시 조건식을 만족할 때까지 자신의 코드 블록을 반복하는 문법입니다. 구조는 다음과 같습니다.

while(조건식)
{
    // 본문
}
  • 조건식 : while문이 수행될 조건이 있는 곳입니다. 예를 들어 변수 i가 5보다 작은 동안만 수행하는 조건은 i < 5입니다.

for문을 사용해서 1씩 작아지는 변수가 0보다 클 때까지만 출력하는 예제를 만들어보겠습니다.

#include <stdio.h>

int main(void) {
	int i;
	i = 5;  
	
	while(i > 0)  
	{
		printf("i = %d\n", i);  
		i--;  
	}
	return 0;
}

[출력]

i = 5
i = 4
i = 3
i = 2
i = 1

① i를 초기화하고 ② 조건식에서 참인지 검사합니다. ③ 참일 때 수행할 본문입니다. ④ 이 역시 본문입니다. 그런데 조건식에서 사용할 i를 증가시켜주는 역할을 하고 있군요.

조건식이 어떻게 되는지 알아볼까요?

  • 조건식 : i값이 5보다 작아야 참(treu)입니다.

while문에서는 초기화와 증감식이 꼭 필요한 것은 아니지만 이 예제에서 그와 같은 열할을 하는 곳을 아래와 같이 정리해볼게요.

  • 초기화 : i = 5;
  • 증감식 : i–;

흐름은 다음과 같습니다.

흐름

while문을 for문으로 변환하기

while문과 for문은 서로로 변환할 수 있습니다. 앞에서 다룬 while문을 for문으로 변환해보겠습니다.

힌트는 초기화, 조건식, 증감식에 있습니다. while문에서 각각 무엇이었는지 다시 살펴봅시다.

  • 조건식 : i < 5;
  • 초기화 : i = 5;
  • 증감식 : i–;

이 셋을 for문에 넣어주면 되겠네요.

int main(void) {
	
	for(int i = 5 ; i > 0 ; i--)
	{
		printf("i = %d\n", i);
	}
	return 0;
}

참 쉽죠?

beak와 continue 사용하기

while문에도 이 두 예약어를 사용할 수 있습니다. 기본적인 기능은 역시나 for문 때와 같습니다. break는 자신이 속한 while문 밖으로 나가는 예약어입니다. continue는 실행 블록을 마치고 조건식으로 점프하는 예약어입니다.

예제를 하나 보면서 설명하겠습니다.

#include <stdio.h>

int main(void) {
	int i;
	i = 5;  
	
	while(i > 0)  
	{
		if(i == 4)
		{
			i--;
			printf("continue\n");
			continue;
		}
		else
		{
			printf("i = %d\n", i);
			i--;
		}
		
		if(i <= 0)
		{
			printf("break : i = %d\n", i);
			break;
		}
	}
	return 0;
}

[출력]

i = 5
continue
i = 3
i = 2
i = 1
break : i = 0

위 예제는 i가 4일 때 출력하지 않습니다. i가 0이면 조건문으로 돌아가지 않고 while문을 빠져나가 다음 문장을 수행합니다.

흐름을 그림으로 살펴보면 다음과 같습니다.

흐름

무한루프 만들기

while문으로 무한히 반복되는 반복문을 만들 수 있습니다. 조건식이 항상 참이면 됩니다. 항상 참으로 만드는 방법은 다양하지만 다음과 같이 두 가지 방법이 주로 쓰입니다.

while(1) { 본문 }
while(true) { 본문 }

이런 무한히 반복되는 반복문에서 빠져 나가는 방법이 있습니다. 익히 배운 예약어인 break, return을 사용하면 됩니다. 또는 exit() 등의 함수를 사용해도 됩니다. exit() 함수는 해당 프로세스를 종료하는 함수입니다. 프로세스를 종료하는 함수는 exit() 함수 말고도 많습니다. 일단 이정도만 알고 넘어갑시다.