주인장의 프로그래밍 개발 공부방

[Chapter 4 반복문] 3. while문이란? 본문

프로그래밍 기본 지식/Chapter 4 반복문

[Chapter 4 반복문] 3. while문이란?

거신 2019. 7. 4. 00:54

이번에는 반복문의 2인자인 while문에 대해서 알아보도록 하자.

보통 while문은 무한루프를 구현하는데 많이 사용되는데

어떤 경우인지 제대로 살펴보도록 하자.

 

목표 : while문의 구조를 정확하게 이해하고 사용하는 방법을 제대로 이해해 직접 사용할 수 있다.

 

1. while문?

 

우리는 이전에 반복문에서 가장 대표적인 녀석인 for문에 대해서 알아봤다.

반복문에는 for문 뿐만 아니라 while문, do-while문이 있다고 했는데

여기에서 while문은 같은 반복문이지만 사용하는 형태와 경우가

for문과는 많이 다르다.

 

3개의 식을 지정해야 하는 for문과는 다르게

while문은 조건식 또는 조건식의 결과만 가지고 동작한다.

그렇기 때문에 for문보다 쉬워 보일 수 있지만

꼭 그렇지만도 않다.

다른 부분에서 실수하는 경우가 꽤 많으며

일단 조건식이 하나 밖에 없기 때문에 for문보다는 조금 덜 자유롭다는 약간의 단점도 있다.

그렇다면 뭐가 어떻게 다르길래 그러는건지 일단 구조부터 알아보자.

 

2. while문의 구조

 

구조)

while(조건식 또는 조건식의 결과값(true 또는 false) {
	구현부
    (break;)	//어떠한 형태로든 멈추기만 하면 됨.
}

while문의 구조는 이렇게 생겼는데

while의 ( )안에는 조건식이 들어와도 되고

true 또는 false가 그대로 들어와도 되며

true, false를 가지고 있는 변수가 들어와도 아무 문제가 없다.

하지만 처음부터 false가 들어오는 경우는 거의 없다.

그 이유는 while문의 동작 방법때문에 그런데

기본적으로 ( ) 안의 값이 true가 되어야만 해당 while문이 실행되기 때문이다.

이 후에 나오는 중첩 반복문에서는 등장할진 몰라도

지금은 그런 경우가 아예 없을테니 걱정하지 말자.

 

그렇다면 while문의 간단한 예시를 알아보자.

 

예시1)

int number = 0;
while(number < 10) {
	System.out.print(number++);
}

일단 결과부터 살펴보면

 

결과)

0123456789

 

와 같이 0부터 9까지 출력되는 것을 확인할 수가 있다.

while문 안에서 number가 1씩 증가하면서 출력하는데

number가 10이 되는 순간 ( ) 안에 있는 조건식이 false가 되면서

while문이 종료된다.

이와 같이 ( )안이 true가 되면 while문은 무한정 반복할 것이다.

어떻게 보면 for문보다 굉장히 간단하게 느껴질 수도 있지만

여기에는 흔히 놓칠 수 있는 치명적인 단점이 숨어있다.

 

3. 빠져나갈 구멍?

 

while문은 맨 처음에 언급했었지만 무한 루프에서 자주 사용된다.

즉, 만약 ( ) 안이 true라면 while문이 실행될텐데

기본적으로 while문은 시작과 끝이 없기 때문에

무한으로 반복하게 된다.

다시 말해, 끝나는 부분을 작성하지 않으면 while문은 무한히 반복한다는 뜻이다.

컴퓨터에 과부하가 걸려서 멈추지 않는 이상 말이다.

 

그렇기 때문에 while문의 구조에서

break;와 같은 명령문을 종료시키는 무언가 또는 어떠한 형태를 작성해줘야만 한다.

꼭 break;만 써야하는건 아니고 break;와 같이

반복문을 종료시킬 수 있는 명령어라면 무엇이든 가능하다.

다른 방법에 대해서는 이후에 알아보도록 하자.

 

다시 돌아와서 while문에는 시작과 끝이 없기 때문에

만약 우리들이 반복문이 끝나는 지점을 정해주지 않으면

무한정 반복하게 된다.

그렇기 때문에 반복문 밖으로 빠져나갈 수 있는 구멍을 만들어줘야 하는데

위의 while문의 구조에서는 break;를 사용하는 것이다.

예시1에서는 특별히 break;를 적어주진 않았지만

number를 증가시킴으로써 저절로 동작을 멈추게 해줬다.

이 부분은 꼭 기억하고 있어야하는 부분이기 때문에 잊지않도록 하자.

 

4. while문을 종료시키는 방법

 

while문에서 빠져나가는 구멍, 종료시키는 방법의 형태는 다양하다.

그 중에서 간단하고 쉬우면서도 자주 사용할 수 있는 방법들에 대해서

알아보도록 하자.

 

1) break;

 

while문의 구조를 알아볼 때 등장했던 break;이다.

이 전에 조건문에서 switch문에서 등장한 녀석과 똑같은 역할을 한다.

여기에서 break;는 while문을 종료시키는 역할을 하게 되는데

이러한 형태는 보통 while문 안에 if문이 들어있을 때 주로 사용된다.

 

break; 예시)

int number = 0;
while(true) {
    number++;
    if(number < 10) {
    	System.out.print(number);
    }
    else {
    	System.out.println();	//단순히 줄 바꾸는 용도
    	System.out.println("while문을 종료합니다.");
    	break;
    }
}

결과)

123456789

while문을 종료합니다.

 

예시1을 응용해서 만든 while문이 되겠다.

while문 안에 if문이 포함되어 있는 형태가 되는데

여기에서 number가 1씩 증가하면서 출력하게 되고

number가 10이 되면 else로 들어가서

해당 구현부를 실행하고 break;를 만나

while문을 종료하게 된다.

 

이러한 형태가 일반적으로 while문 안에서 break;를 사용하는 방법인데

간단하면서도 if문을 사용한다면 자주 사용하게 될 구조라고 볼 수 있겠다.

 

2) System.exit(0);

 

두 번째는 System.exit(0);라는 명령어인데

처음 본 명령어일 것이다.

일단 기능부터 소개하자면

이 명령어를 만나면 프로그램은 완전히 종료하게 된다.

말 그대로 명령어 자체가 '프로그램 종료'라는 명령어가 되겠다.

 

System.exit(0); 예시)

int number = 0;
while(true) {
    number++;
    if(number < 10) {
    	System.out.print(number);
    }
    else {
    	System.out.println();	//단순히 줄 바꾸는 용도
    	System.out.println("while문을 종료합니다.");
    	System.exit(0);
    }
}

 

결과는 break; 예시와 동일하게 나온다.

break; 예시에서 break;System.exit(0);으로 바꾼 것 뿐이기 때문에

동작도 동일하고 결과도 동일하게 나온다.

이런 명령어도 있다는 것만 알고 있어도 된다.

 

3) 조건식이 false

 

이 부분은 ( )안이 false가 되는 경우를 말하는 것이다.

 

조건식false 예시)

int number = 1;
while(number <= 10) {
	System.out.print(number++);
}

앞서 봤던 예시1과 결과는 조금 차이가 나지만

똑같은 구조의 코드가 되겠다.

break; 예시System.exit(0) 예시처럼 ( )안에 true가 그대로 들어가는 것이 아니라

number <= 10 처럼 조건식을 넣어서

true가 되면 while문은 계속 실행되고 false가 되면 멈추는 구현을 한 것이다.

이렇게 작성하면 for문처럼 시작과 끝을 지정해줄 수 있기 때문에

break;System.exit(0);사용하지 않아도

반복문을 종료시킬 수 있다.

하지만 이렇게 쓴다면 차라리 for문을 사용하는게 훨씬 효과적이라고 할 수 있겠다.

 

4) 플래그 변수

 

마지막으로 플래그 변수인데

크게 대단한 것은 아니고 while문을 동작시키는 기준이 되는

변수를 하나 선언하는 것을 말한다.

즉, 플래그 변수가 되는 변수에 true나 false를 저장해서

while문을 동작시키거나 멈추게 할 수 있는 것이다.

 

플래그 변수 예시)

Scanner sc = new Scanner(System.in);
boolean flag = true;
while(flag) {
	System.out.println("메뉴 : 1. 더하기 2. 빼기 3. 종료");
	System.out.print("입력 : ");
	int input = sc.nextInt();
	switch(input) {
	case 1:
		System.out.println("더하기를 합니다.");
		break;
	case 2:
		System.out.println("뺴기를 합니다.");
		break;
	case 3:
		System.out.println("프로그램을 종료합니다.");
		flag = false;
		break;
    	default:
    		System.out.println("숫자를 다시 입력하세요.");
	}
}
sc.close();

위와 같은 형태가 플래그 변수를 사용해서 while문을 제어하는 것이 되겠다.

조건식이 false 예시에서 확장된 내용인데 이 역시 ( )안에 false가 들어가는 것이 되겠다.

일반적으로 while문을 사용해서 프로그램을 작성한다면

플래그 변수 예시와 같은 형태가 대부분이 될 것이다.

지금까지 우리가 작성했던 프로그램들처럼

한 번만 실행하고 종료되는게 아니라

프로그램이 시작하면 선택지를 고르고

선택지에 맞는 명령을 실행한 후

사용자가 프로그램 종료를 선택하기 전까지

프로그램은 계속해서 실행되는 형태를 말이다.

 

플래그 변수 예시에서

선택지에서 3번을 선택하면 프로그램을 종료한다는 문구를 출력하고

값이 true였던 변수 flag가 false로 바뀌고

while(flag)는 while(false)의 형태가 되기 때문에

반복문을 종료하게 되는 것이다.

 

여기에서 앞서 사용했던 break;System.exit(0);를 사용할 순 없을까?

라고 생각할 수 있는데 물론 방법이 있다.

하지만 이렇게 작성하는게 소스코드 줄도 줄일 수 있고

더 효과적인 방법이라고 생각한다.

 

5. 마무리

 

반복문 중에서 무한 루프의 경우에 사용하는 while문에 대해서 알아봤다.

while문은 for문과는 달리 시작과 끝을 지정하지 않고

조건식 또는 조건식의 값(true 또는 false)을 사용해

반복문을 실행하기 때문에

간단해 보일 수는 있지만 범위를 지정하지 않기 때문에

자칫 무한 루프에서 빠져나오지 못하는 경우가 발생할 수도 있다.

그렇기 때문에 break;System.exit(0);와 같은

while문빠져나오는 구멍을 필히 만들어줘야 한다.

while문을 종료하는 방법에는 여러가지가 있지만

대표적으로 break;를 사용하거나

System.exit(0); 그리고

조건식이 false가 되거나 플래그 변수를 선언해서

( )안에 false를 집어넣는 방법이 되겠다.

Comments