Do while
Do-while 루프는 대부분의 컴퓨터 프로그래밍 언어에서 주어진 불린 자료형 조건을 기반으로 코드가 한 번 실행할 수 있게 하는 제어 흐름문이다. 대부분의 언어와 달리 포트란의 do 루프(roop)는 실제로는 for 루프와 같다.[1]
개요
while문과 마찬가지로 제어 변수가 없고 반복 횟수가 가변적이지만 조건을 점검하는 시기가 다르다. while문은 루프로 들어가기 전에 조건을 점검하지만 do~while문은 일단 명령을 실행한 후 루프 계속 여부를 점검한다. 그래서 while문은 조건에 따라 한 번도 실행되지 않을 수도 있지만 do~while문은 최소한 한 번은 실행된다는 차이점이 있다. 요약하자면 while문은 선평가 후실행문이며 do~while문은 선실행 후평가문이다. 즉, do~while 문은 문의 고정된 블록을 무한정 실행하는 데 사용한다. do While ... loop는 해당 조건을 평가하고 조건이 참(true)일 경우 그 뒤에 나오는 문을 평가한다. 이 작업이 끝나면 다시 조건을 평가하고 조건이 참(true)일 경우 문을 다시 평가한다. 조건이 거짓(false)일 때까지 이 과정을 계속 반복한다.[2]
부연설명
초기식을 먼저 실행하고 루프로 진입하며 매 명령을 실행할 때마다 증감식을 실행하면 while문으로도 for문과 똑같은 구조를 만들 수 있으며 완전히 같지는 않아서 루프 내부에서 continue명령을 사용할 때의 효과가 약간 달라진다. 반대로 while (조건) 명령; 도 for (;조건;) 명령; 형식으로 변환할 수 있다. 제어문에 따른 실행 속도나 코드의 크기는 거의 차이가 없으므로 실행 속도는 제어문을 선택하는 기준이 아니다. 하지만 어느 쪽이 더 효율적이고 코드의 가독성이 높은지, 부작용은 없는지를 비교해 보면 세가지 반복문 중 가장 적절한 것이 있을 것이다. 세가지 제어 구조의 특징을 잘 파악해야 상황에 가장 적절한 반복문을 선택할 수 있다. 1~100까지 숫자의 합계를 구하는 루프는 for문이 가장 적당하다. 반복 범위가 미리 정해져 있고 이 값이 루프내에서 사용되어야 하므로 제어 변수를 쓰는 것이 효율적이며 코드도 훨씬 더 짧고 명료하다. 예를 들어, 숫자 맞추기 게임에서는 사용자가 입력한 숫자와 컴퓨터가 생각한 숫자를 비교하기 위해 do~while 문을 사용한다. 이 경우 왜 do~while 루프가 가장 적절한가 하면 일단 사용자로부터 값을 입력받아야만 루프를 탈출할 것인지 계속할 것인지를 결정할 수 있기 때문이다. 즉, 조건을 점검하기 전에 일단 사용자로부터의 입력을 최소한 한 번은 먼저 받아야만 하는 것이다. [2]
구조
for문이나 while문의 구조보다 do-while문의 구조는 조금 다르게 생겼다.
while문 구조) do { 구현부(무조건 한 번은 실행됨) } while(조건식이나 그 결과값)
위의 예시처럼 do { }라는 부분이 등장하게 되는데 이 부분이 for문, while문이랑의 가장 큰 차이점이라고 할 수 있다. do-while은 프로그램이 반복문을 만나게 되면 조건식의 결과가 참(true)든 거짓(false)든 상관없이 무조건 do 부분을 한 번을 실행하게 된다. 특이한 점이 반복문의 구현부가 먼저 앞에 등장하고 그 다음 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]
사용법
반복문을 이용해 프로그램을 하나 만든다고 가정했을때 do-while문의 특성을 예시로 확인한다.
- 조건 : int number < 0 라는 조건과 반복문을 이용해서 0을 출력하는 프로그램을 만들어보라.
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가지의 반복문으로 작성을 했을때 3가지 예시 중 위의 조건을 만족시킬 수 있는 코드는 do-while문 예시 뿐이다. while문 예시는 애초에 while의 조건이 false가 되기 때문에 실행이 되지 않고 for문 예시 역시 number < 0에서 false가 되기 때문에 실행이 되지 않는다. 하지만 do-while문은 무조건 한 번은 실행하기 때문에 일단 0을 출력하고 그 다음부터는 조건이 false가 되기 때문에 반복을 하지 않는다. 이와 같이 무조건 한 번은 실행한다는 것이 do-while문의 핵심이다.[3]
언어별 do while문
언어별 do while문 작성 예시이다.[1]
- 씨언어(C Language)
int counter = 5; int factorial = 1; do { factorial *= counter--; /* Multiply, then decrement. */ } while (counter > 0); printf("factorial of 5 is %d\n", factorial);
- 씨샵(C#)
int counter = 5; int factorial = 1; do { factorial *= counter--; /* Multiply, then decrement. */ } while (counter > 0); System.Console.WriteLine(factorial);
- 자바(JAVA)
int counter = 5; int factorial = 1; do { factorial *= counter--; /* Multiply, then decrement. */ } while (counter > 0); System.out.println(factorial);
- 자바스크립트(JavaScript)
var counter = 5; var factorial = 1; do { factorial *= counter--; } while (counter > 0); console.log(factorial);
- 액션스크립트 3(ActionScript 3)
var counter:int = 5; var factorial:int = 1; do { factorial *= counter--; /* Multiply, then decrement. */ } while (counter > 0); trace(factorial);
- 에이다(Ada)
with Ada.Integer_Text_IO; procedure Factorial is Counter : Integer := 5; Factorial : Integer := 1; begin loop Factorial := Factorial * Counter; Counter := Counter - 1; exit when Counter = 0; end loop; Ada.Integer_Text_IO.Put (Factorial); end Factorial;
- 포트란(FORTRAN)
program FactorialProg integer :: counter = 5 integer :: factorial = 1 do factorial = factorial * counter counter = counter - 1 if (counter == 0) exit end do print *, factorial end program FactorialProg
포트란 90 이후 위의 iteration count가 없는 형태의 do 문과 아래의 do while 문이 추가되었다.
program FactorialProg integer :: counter = 5 integer :: factorial = 1 factorial = factorial * counter counter = counter - 1 do while (counter > 0) factorial = factorial * counter counter = counter - 1 end do print *, factorial end program FactorialProg
- 펄(Perl)
$counter = 5; $factorial = 1; do { $factorial *= $counter--; } while ($counter > 0); print $factorial;
- 피에이치피(PHP)
<?php $counter = 5; $factorial = 1; do { $factorial *= $counter--; } while ($counter > 0); echo $factorial; ?>
- 루비(Ruby)
counter = 5 factorial = 1 begin factorial *= counter counter -= 1 end while counter > 0 puts factorial
- 비주얼 베이직 닷넷(Visual Basic .NET)
Dim counter As Integer = 5 Dim factorial As Integer = 1 Do factorial *= counter counter -= 1 Loop While counter > 0 Console.WriteLine(factorial)
각주
- ↑ 1.0 1.1 〈do-while루프〉, 《위키백과》
- ↑ 2.0 2.1 몽키몽키, 〈반복문(while, do~while, for) 비교 및 차이 개념잡기〉, 《네이버블로그》, 2006-05-16
- ↑ 3.0 3.1 〈(Chapter 4 반복문) 4. do-while문〉, 《티스토리》, 2019-07-08