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

[Chapter 4 반복문] 4. do-while문 본문

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

[Chapter 4 반복문] 4. do-while문

거신 2019. 7. 8. 02:04

반복문의 마지막 단계에 접어들었다.

이번에 알아볼 내용은 do-while문이다.

do-while문은 while문과 거의 흡사한 녀석이지만 약간의 차이가 있다.

 

목표 : do-while문의 구조를 이해하고 활용할 수 있다.

 

1. do-while문?

 

do-while문while문에서 파생된 반복문이라고 할 수 있다.

이 녀석이 등장한 계기는 바로 반복문이 해당 조건에 만족할 때만 실행되는 것을

어떠한 상황이라도 무조건 반복문을 한 번은 실행시키기 위해서 등장했다.

어떤 경우에 그렇게 사용하는지는 아직 자세히 이해하진 못하겠지만

일단 do-while문이 이런 동작을 하는 것이라는 것은 알고 있길 바란다.

 

do-while문 역시 조건식이 필요하고 반복문과 동일하게 구현부가 존재한다.

그러나 우리가 알고 있는 반복문의 형태와는 조금 다르다는 것을 미리 알고 있자.

그렇다면 do-while문은 어떻게 생긴 녀석일까?

 

2. do-while문의 구조

 

do-while문의 구조는 앞서 봤었던 for문이나 while문과 조금 다르게 생겼다.

 

구조)

do {
	구현부(무조건 한 번은 실행됨)
} while(조건식이나 그 결과값)

여기에서 do { }라는 부분이 등장하게 되는데

이 부분이 앞의 다른 반복문과의 가장 큰 차이점이라고 할 수 있겠다.

do-while은 프로그램이 반복문을 만나게 되면

일단 무조건 do 부분을 한 번을 실행하게 된다.

조건식의 결과가 true든 false든 상관없이 말이다.

 

특이한 점이 반복문의 구현부가 먼저 앞에 등장하고 그 다음에

while이 등장하는 것이다.

이러한 구조를 가지고 있기 때문에 프로그램에서 do-while문을 실행할 때

구현부에 있는 내용을 일단 실행을 하게 된다.

그리고 구현부 안에서의 동작에 따라 또는 while의 ( ) 안의 조건식 또는 결과값에 따라서

계속 반복할 것인지 아니면 한 번의 실행으로 종료할 것인지 결정되는 것이다.

 

그렇다면 do-while문이 어떻게 쓰이는지 예시를 통해서 알아보도록 하자.

 

예시1)

Scanner sc = new Scanner(System.in);
do {
	System.out.println("메뉴를 선택하세요.");
	System.out.println("1. 실행\t2. 종료");
	int menu = sc.nextInt();
	switch(menu) {
	case 1:
		System.out.println("실행했습니다.");
		break;
	case 2:
		System.out.println("프로그램을 종료합니다.");
		sc.close();
		System.exit(0);
	}
} while(true);

위의 예시를 살펴보면 형태가 조금 달라보일지도 모르지만

실상 프로그램을 실행해보면 우리가 앞서 사용했었던

while문과 별반 다를게 없다.

while문에서 사용하던걸 do-while문의 형태로 고친 것 뿐이다.

사실 이렇게 작성하면 do-while로 작성한 의미가 없기는 하지만

do-while문도 일단은 반복문이라는 것을 알 수 있다.

 

그렇다면 do-while문의 동작을 좀 더 확연하게 알 수 있는 코드로 예시를 바꿔보자.

 

예시2)

Scanner sc = new Scanner(System.in);
do {
	System.out.println("메뉴를 선택하세요.");
	System.out.println("1. 실행\t2. 종료");
	int menu = sc.nextInt();
	switch(menu) {
	case 1:
		System.out.println("실행했습니다.");
		break;
	case 2:
		System.out.println("프로그램을 종료합니다.");
		sc.close();
		System.exit(0);
	}
} while(false);

예시1과 비교하면 딱 한 군데가 바뀌었다.

바로 while(true) 부분이 while(false)로 바뀐 것 뿐이다.

그런데 실행하면 우리가 알고 있는 반복문과는 전혀 다르게 프로그램이 동작할 것이다.

 

기본적으로 while(false)라고 작성했다면 반복문은 단 한 번도 실행되지 않아야 한다.

그러나 do-while문은 앞에서도 언급했듯이 일단 무조건 구현부를 한 번은 실행하게 된다.

그래서 일단 프로그램을 실행하면 메뉴를 선택하라는 문구가 출력되고

여기에서 메뉴를 어떤 것을 선택하더라도 while(false)이기 때문에

프로그램은 다시 반복하지 않고 종료하게 된다.

 

이와 같이 조건식에 상관없이 무조건 한 번 실행하는 반복문이 바로

do-while문이다.

 

3. 그러면 도대체 이걸 왜 써야 되는데?

 

이런 생각이 들 것이다.

굳이 한 번만 실행할 것이라면 도대체 이게 왜 존재하고 있으며 왜 써야하는지.

이렇게 생각해보자.

반복문을 이용해서 프로그램을 하나 만든다고 가정했을 때

이러한 프로그램을 작성해야한다면 어떨까?

 

조건)

int number < 0 라는 조건과 반복문을 이용해서 0을 출력하는 프로그램을 만들어보라.

 

조건이 굉장히 뭐시기한 거 같지만 그러려니 하고 넘어가자.

이 조건은 do-while문을 위한 조건이기 때문에 억지로 만든 감이 없지 않아 있다.

길게 말할 필요없이 일단 코드부터 작성해보자.

 

do-while문 예시)

int number = 0;
do {
	System.out.println(number);
} while(number < 0);

 

while문 예시)

int number = 0;
while(number < 0 ) {
	System.out.println(number);
}

 

for문 예시)

int number = 0;
for(int i = 0; number < 0; i++) {
	System.out.println(i);
}

이렇게 조건을 무조건 포함시키면서 3가지의 반복문으로 작성을 했다.

여기에서 위의 조건을 만족시킬 수 있는 코드는 do-while문 예시 뿐이다.

while문 예시는 애초에 while의 조건이 false가 되기 때문에 실행조차되지 않고

for문 예시 역시 number < 0에서 false가 되기 때문에 실행조자되지 않는다.

 

하지만 do-while문무조건 한 번은 실행하기 때문에

일단 0을 출력하고 그 다음부터는 조건이 false가 되기 때문에 반복을 하지 않는 것이다.

이와 같이 do-while문무조건 한 번은 실행한다는 것이 핵심이 되겠다.

 

사실 여러 프로그램을 작성하면서 굳이 do-while문을 사용하지 않아도

작성할 수 있기는 하지만 do-while문을 사용해서 작성했을 때

while문이나 for문보다 코드의 수도 줄어드는 경우도 간혹 발견할 수 있을 것이다.

 

가장 대표적으로 do-while문에서 단 한 번만 실행되는 코드를 작성했을 때

이를 while문으로 변경하면 while문 안에서 반복을 멈춰주는 코드를 새로 추가해줘야하니

당연히 코드가 늘어날 수 밖에 없게 되는 것이다.

이러한 장점이 있기 때문에 특별한 경우에는 do-while문을 사용했을 때

훨씬 효율적인 부분이 생길 수 있다.

 

그러나 아직까진 우리가 배우는 입장에서는 일부러 do-while문을 사용하는게 아니라면

거의 대부분 for문과 while문 만으로도 작성이 가능하기 때문에

do-while문이 이렇게 생겼고 이러한 동작을 하며 이러한 특징이 있다는 것만 알고 있어도

멀리 바라봤을 때 굉장한 도움이 될 것이라고 생각한다.

 

4. 마무리

 

반복문에서 do-while문이라는 녀석에 대해서 알아봤다.

이 녀석은 while문과 마찬가지로 조건식과 구현부가 필요한데

do { 구현부 } while(조건식 또는 그 결과 값)

이라는 형태를 지니고 있으며 무조건 구현부가 한 번은 실행이 된다는 특징을 가지고 있다.

그렇기 때문에 계속해서 반복하거나 아예 실행이 되지 않거나가 아니라

일단 구현부가 한 번 실행된 뒤에 그 다음의 조건에 따라서 반복을 할지

멈출지를 결정하는 반복문이 되겠다.

Comments