검수요청.png검수요청.png

"Do while"의 두 판 사이의 차이

위키원
이동: 둘러보기, 검색
(개요)
(부연설명)
8번째 줄: 8번째 줄:
  
 
==부연설명==
 
==부연설명==
초기식을 먼저 실행하고 루프로 진입하며 매 명령을 실행할 때마다 증감식을 실행하면 [[while]]문으로도 [[for]]문과 똑같은 구조를 만들 수 있으며 완전히 같지는 않아서 루프 내부에서 [[continue]]명령을 사용할 때의 효과가 약간 달라진다. 반대로 while (조건) 명령; 도 for (;조건;) 명령; 형식으로 변환할 수 있다. 제어문에 따른 실행 속도나 코드의 크기는 거의 차이가 없으므로 실행 속도는 제어문을 선택하는 기준이 아니다. 하지만 어느 쪽이 더 효율적이고 코드의 가독성이 높은지, 부작용은 없는지를 비교해 보면 세가지 [[반복문]] 중 가장 적절한 것이 있을 것이다. 세가지 제어 구조의 특징을 잘 파악해야 상황에 가장 적절한 반복문을 선택할 수 있다. 1~100까지 숫자의 합계를 구하는 루프는 for문이 가장 적당하다. 반복 범위가 미리 정해져 있고 이 값이 루프내에서 사용되어야 하므로 제어 변수를 쓰는 것이 효율적이며 코드도 훨씬 더 짧고 명료하다. 예를 들어, 숫자 맞추기 게임에서는 사용자가 입력한 숫자와 컴퓨터가 생각한 숫자를 비교하기 위해 do~while 문을 사용한다. 이 경우 왜 do~while 루프가 가장 적절한가 하면 일단 사용자로부터 값을 입력받아야만 루프를 탈출할 것인지 계속할 것인지를 결정할 수 있기 때문이다. 즉, 조건을 점검하기 전에 일단 사용자로부터의 입력을 최소한 한 번은 먼저 받아야만 하는 것이다. <ref name=몽키></ref>
+
초기식을 먼저 실행하고 루프로 진입하며 매 명령을 실행할 때마다 증감식을 실행하면 [[while]]문으로도 [[for]]문과 똑같은 구조를 만들 수 있으며 완전히 같지는 않아서 루프 내부에서 [[continue]]명령을 사용할 때의 효과가 약간 달라진다. 반대로 while (조건) 명령; 도 for (;조건;) 명령; 형식으로 변환할 수 있다. 제어문에 따른 실행 속도나 코드의 크기는 거의 차이가 없음으로 실행 속도는 제어문을 선택하는 기준이 아니다. 하지만 어느 쪽이 더 효율적이고 코드의 가독성이 높은지, 부작용은 없는지를 비교해 보면 세 가지 [[반복문]] 중 가장 적절한 것이 있을 것이다. 세 가지 제어 구조의 특징을 잘 파악해야 상황에 가장 적절한 반복문을 선택할 수 있다. 1~100까지 숫자의 합계를 구하는 루프는 for문이 가장 적당하다. 반복 범위가 미리 정해져 있고 이 값이 루프 내에서 사용되어야 하므로 제어 변수를 쓰는 것이 효율적이며 코드도 훨씬 더 짧고 명료하다. 예를 들어, 숫자 맞추기 게임에서는 사용자가 입력한 숫자와 컴퓨터가 생각한 숫자를 비교하기 위해 do while 문을 사용한다. 이 경우 왜 do while 루프가 가장 적절한가 하면 일단 사용자로부터 값을 입력받아야만 루프를 탈출할 것인지 계속할 것인지를 결정할 수 있기 때문이다. 즉, 조건을 점검하기 전에 일단 사용자로부터의 입력을 최소한 한 번은 먼저 받아야만 하는 것이다. <ref name=몽키></ref>
  
 
==구조==
 
==구조==

2021년 7월 30일 (금) 13:18 판

Do while문 순서도
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]

int counter = 5;
int factorial = 1;
do {
   factorial *= counter--; /* Multiply, then decrement. */
} while (counter > 0);
printf("factorial of 5 is %d\n", factorial);
int counter = 5;
int factorial = 1;
do {
   factorial *= counter--; /* Multiply, then decrement. */
} while (counter > 0);
System.Console.WriteLine(factorial);
int counter = 5;
int factorial = 1;
do {
  factorial *= counter--; /* Multiply, then decrement. */
} while (counter > 0);
System.out.println(factorial);

var counter = 5;
var factorial = 1;
do {
    factorial *= counter--;
} while (counter > 0);
console.log(factorial);

var counter:int = 5;
var factorial:int = 1;
do {
  factorial *= counter--; /* Multiply, then decrement. */
} while (counter > 0);
trace(factorial);
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;

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
$counter = 5;
$factorial = 1;
do {
     $factorial *= $counter--;
} while ($counter > 0);
print $factorial;

<?php
$counter = 5;
$factorial = 1;
do {
     $factorial *= $counter--;
} while ($counter > 0);
echo $factorial;
?>

counter = 5
factorial = 1
begin
  factorial *= counter
  counter -= 1
end while counter > 0
puts factorial
Dim counter As Integer = 5
Dim factorial As Integer = 1
Do
   factorial *= counter
   counter -= 1
Loop While counter > 0
Console.WriteLine(factorial)

각주

  1. 1.0 1.1 do-while루프〉, 《위키백과》
  2. 2.0 2.1 몽키몽키, 〈반복문(while, do~while, for) 비교 및 차이 개념잡기〉, 《네이버블로그》, 2006-05-16
  3. 3.0 3.1 (Chapter 4 반복문) 4. do-while문〉, 《티스토리》, 2019-07-08

참고자료

같이 보기


  검수요청.png검수요청.png 이 Do while 문서는 프로그래밍에 관한 글로서 검토가 필요합니다. 위키 문서는 누구든지 자유롭게 편집할 수 있습니다. [편집]을 눌러 문서 내용을 검토·수정해 주세요.