"Do while"의 두 판 사이의 차이
(→언어별 do while문) |
|||
(사용자 2명의 중간 판 9개는 보이지 않습니다) | |||
1번째 줄: | 1번째 줄: | ||
[[파일:순서도.png|썸네일|200픽셀|'''Do while문 순서도''']] | [[파일:순서도.png|썸네일|200픽셀|'''Do while문 순서도''']] | ||
[[파일:두와일문.jpg|썸네일|300픽셀|'''Do while문''']] | [[파일:두와일문.jpg|썸네일|300픽셀|'''Do while문''']] | ||
− | |||
+ | '''Do-while'''(두 와일) 루프는 대부분의 컴퓨터 프로그래밍 언어에서 주어진 [[불린]] 자료형 조건을 기반으로 코드가 한 번 실행할 수 있게 하는 제어 흐름문이다. 대부분의 언어와 달리 [[포트란]]의 do 루프(roop)는 실제로는 [[for]] 루프와 같다.<ref name=위키>〈[https://ko.wikipedia.org/wiki/Do-while_%EB%A3%A8%ED%94%84 do-while루프]〉, 《위키백과》</ref> | ||
==개요== | ==개요== | ||
− | [[while]]문과 마찬가지로 제어 변수가 없고 반복 횟수가 가변적이지만 조건을 점검하는 시기가 다르다. while문은 루프로 들어가기 전에 조건을 점검하지만 do | + | [[while]]문과 마찬가지로 제어 변수가 없고 반복 횟수가 가변적이지만 조건을 점검하는 시기가 다르다. while문은 루프로 들어가기 전에 조건을 점검하지만, do while문은 일단 명령을 실행한 후 루프 계속 여부를 점검한다. 그래서 while문은 조건에 따라 한 번도 실행되지 않을 수도 있지만 do while문은 최소한 한 번은 실행된다는 차이점이 있다. 요약하자면 while문은 선평가 후실행문이며 do while문은 선실행 후평가문이다. 즉, do while 문은 문의 고정된 블록을 무한정 실행하는 데 사용한다. do While ... loop는 해당 조건을 평가하고 조건이 참(true)일 경우 그 뒤에 나오는 문을 평가한다. 이 작업이 끝나면 다시 조건을 평가하고 조건이 참(true)일 경우 문을 다시 평가한다. 조건이 거짓(false)일 때까지 이 과정을 계속 반복한다.<ref name=몽키>몽키몽키, 〈[https://m.blog.naver.com/cache798/130004441185, 반복문(while, do~while, for) 비교 및 차이 개념잡기]〉, 《네이버블로그》, 2006-05-16</ref> |
==부연설명== | ==부연설명== | ||
− | 초기식을 먼저 실행하고 루프로 진입하며 매 명령을 실행할 때마다 증감식을 실행하면 [[while]]문으로도 [[for]]문과 똑같은 구조를 만들 수 있으며 완전히 같지는 않아서 루프 내부에서 [[continue]]명령을 사용할 때의 효과가 약간 달라진다. 반대로 while (조건) 명령; 도 for (;조건;) 명령; 형식으로 변환할 수 있다. 제어문에 따른 실행 속도나 코드의 크기는 거의 차이가 | + | 초기식을 먼저 실행하고 루프로 진입하며 매 명령을 실행할 때마다 증감식을 실행하면 [[while]]문으로도 [[for]]문과 똑같은 구조를 만들 수 있으며 완전히 같지는 않아서 루프 내부에서 [[continue]]명령을 사용할 때의 효과가 약간 달라진다. 반대로 while (조건) 명령; 도 for (;조건;) 명령; 형식으로 변환할 수 있다. 제어문에 따른 실행 속도나 코드의 크기는 거의 차이가 없음으로 실행 속도는 제어문을 선택하는 기준이 아니다. 하지만 어느 쪽이 더 효율적이고 코드의 가독성이 높은지, 부작용은 없는지를 비교해 보면 세 가지 [[반복문]] 중 가장 적절한 것이 있을 것이다. 세 가지 제어 구조의 특징을 잘 파악해야 상황에 가장 적절한 반복문을 선택할 수 있다. 1~100까지 숫자의 합계를 구하는 루프는 for문이 가장 적당하다. 반복 범위가 미리 정해져 있고 이 값이 루프 내에서 사용되어야 하므로 제어 변수를 쓰는 것이 효율적이며 코드도 훨씬 더 짧고 명료하다. 예를 들어, 숫자 맞추기 게임에서는 사용자가 입력한 숫자와 컴퓨터가 생각한 숫자를 비교하기 위해 do while 문을 사용한다. 이 경우 왜 do while 루프가 가장 적절한가 하면 일단 사용자로부터 값을 입력받아야만 루프를 탈출할 것인지 계속할 것인지를 결정할 수 있기 때문이다. 즉, 조건을 점검하기 전에 일단 사용자로부터의 입력을 최소한 한 번은 먼저 받아야만 하는 것이다. <ref name=몽키></ref> |
==구조== | ==구조== | ||
20번째 줄: | 20번째 줄: | ||
위의 예시처럼 do { }라는 부분이 등장하게 되는데 이 부분이 for문, while문이랑의 가장 큰 차이점이라고 할 수 있다. do-while은 프로그램이 [[반복문]]을 만나게 되면 | 위의 예시처럼 do { }라는 부분이 등장하게 되는데 이 부분이 for문, while문이랑의 가장 큰 차이점이라고 할 수 있다. do-while은 프로그램이 [[반복문]]을 만나게 되면 | ||
− | 조건식의 결과가 참(true)든 거짓(false)든 상관없이 무조건 do 부분을 한 번을 실행하게 된다. 특이한 점이 반복문의 구현부가 먼저 앞에 등장하고 | + | 조건식의 결과가 참(true)든 거짓(false)든 상관없이 무조건 do 부분을 한 번을 실행하게 된다. 특이한 점이 반복문의 구현부가 먼저 앞에 등장하고 그다음 while이 등장하는 것이다. 이러한 구조를 가지고 있기 때문에 프로그램에서 do-while문을 실행할 때 구현부에 있는 내용을 먼저 실행을 하게 된다. 그리고 구현부 안에서의 동작에 따라 또는 while의 ( ) 안의 조건식 또는 결괏값에 따라서 계속 반복할 것인지 아니면 한 번의 실행으로 종료할 것인지 결정되는 것이다. 자바 코드로 예시를 작성한 것은 다음과 같다. |
do while문 예시 1) | do while문 예시 1) | ||
39번째 줄: | 39번째 줄: | ||
} while(true); | } while(true); | ||
− | 위의 예시를 살펴보면 형태가 조금 | + | 위의 예시를 살펴보면 형태가 조금 달라 보일지도 모르지만 실상 프로그램을 실행해보면 while문과 차이점은 크게 없으며 while문에서 사용하던걸 do while문의 형태로 고친 것 뿐이다. 이렇게 작성할시 do while로 작성한 의미가 없지만, do while문도 일단은 반복문이라는 것을 알 수 있다. 좀 더 확연한 예시는 다음과 같다. |
do while문 예시 2) | do while문 예시 2) | ||
83번째 줄: | 83번째 줄: | ||
} | } | ||
− | 이렇게 조건을 무조건 | + | 이렇게 조건을 무조건 포함하면서 3가지의 [[반복문]]으로 작성을 했을때 3가지 예시 중 위의 조건을 만족시킬 수 있는 코드는 do while문 예시 뿐이다. while문 예시는 애초에 while의 조건이 false가 되기 때문에 실행이 되지 않고 for문 예시 역시 number < 0에서 false가 되기 때문에 실행이 되지 않는다. 하지만 do-while문은 무조건 한 번은 실행하기 때문에 일단 0을 출력하고 다음부터 조건이 false가 되기 때문에 반복하지 않는다. 이와 같이 무조건 한 번은 실행한다는 것이 do-while문의 핵심이다.<ref name=자바></ref> |
==언어별 do while문== | ==언어별 do while문== | ||
− | * ''' | + | 언어별 do while문 작성 예시이다.<ref name=위키></ref> |
+ | * '''[[씨언어]]'''(C Language) | ||
int counter = 5; | int counter = 5; | ||
int factorial = 1; | int factorial = 1; | ||
94번째 줄: | 95번째 줄: | ||
printf("factorial of 5 is %d\n", factorial); | printf("factorial of 5 is %d\n", factorial); | ||
− | * ''' | + | * '''[[씨샵]]'''(C#) |
int counter = 5; | int counter = 5; | ||
int factorial = 1; | int factorial = 1; | ||
102번째 줄: | 103번째 줄: | ||
System.Console.WriteLine(factorial); | System.Console.WriteLine(factorial); | ||
− | + | * '''[[자바]]'''(JAVA) | |
− | * '''자바''' | ||
int counter = 5; | int counter = 5; | ||
int factorial = 1; | int factorial = 1; | ||
111번째 줄: | 111번째 줄: | ||
System.out.println(factorial); | System.out.println(factorial); | ||
− | * '''자바스크립트''' | + | * '''[[자바스크립트]]'''(JavaScript) |
var counter = 5; | var counter = 5; | ||
var factorial = 1; | var factorial = 1; | ||
119번째 줄: | 119번째 줄: | ||
console.log(factorial); | console.log(factorial); | ||
− | * '''액션스크립트 3''' | + | * '''[[액션스크립트 3]]'''(ActionScript 3) |
var counter:int = 5; | var counter:int = 5; | ||
var factorial:int = 1; | var factorial:int = 1; | ||
127번째 줄: | 127번째 줄: | ||
trace(factorial); | trace(factorial); | ||
− | * '''에이다''' | + | * '''[[에이다]]'''(Ada) |
with Ada.Integer_Text_IO; | with Ada.Integer_Text_IO; | ||
143번째 줄: | 143번째 줄: | ||
end Factorial; | end Factorial; | ||
− | * '''포트란''' | + | * '''[[포트란]]'''(FORTRAN) |
program FactorialProg | program FactorialProg | ||
integer :: counter = 5 | integer :: counter = 5 | ||
167번째 줄: | 167번째 줄: | ||
end program FactorialProg | end program FactorialProg | ||
− | * '''펄''' | + | * '''[[펄]]'''(Perl) |
$counter = 5; | $counter = 5; | ||
$factorial = 1; | $factorial = 1; | ||
175번째 줄: | 175번째 줄: | ||
print $factorial; | print $factorial; | ||
− | * ''' | + | * '''[[피에이치피]]'''(PHP) |
<?php | <?php | ||
$counter = 5; | $counter = 5; | ||
185번째 줄: | 185번째 줄: | ||
?> | ?> | ||
− | * '''루비''' | + | * '''[[루비]]'''(Ruby) |
counter = 5 | counter = 5 | ||
factorial = 1 | factorial = 1 | ||
194번째 줄: | 194번째 줄: | ||
puts factorial | puts factorial | ||
− | * '''비주얼 베이직 닷넷''' | + | * '''[[비주얼 베이직 닷넷]]'''(Visual Basic .NET) |
Dim counter As Integer = 5 | Dim counter As Integer = 5 | ||
Dim factorial As Integer = 1 | Dim factorial As Integer = 1 | ||
201번째 줄: | 201번째 줄: | ||
counter -= 1 | counter -= 1 | ||
Loop While counter > 0 | Loop While counter > 0 | ||
− | Console.WriteLine(factorial) | + | Console.WriteLine(factorial) |
{{각주}} | {{각주}} | ||
== 참고자료 == | == 참고자료 == | ||
+ | *〈[https://ko.wikipedia.org/wiki/Do-while_%EB%A3%A8%ED%94%84 do-while루프]〉, 《위키백과》 | ||
+ | *몽키몽키, 〈[https://m.blog.naver.com/cache798/130004441185, 반복문(while, do~while, for) 비교 및 차이 개념잡기]〉, 《네이버블로그》, 2006-05-16 | ||
+ | *〈[https://colossus-java-practice.tistory.com/38 (Chapter 4 반복문) 4. do-while문]〉, 《티스토리》, 2019-07-08 | ||
+ | |||
== 같이 보기 == | == 같이 보기 == | ||
+ | * [[반복문]] | ||
+ | * [[while]] | ||
+ | * [[for]] | ||
{{프로그래밍|검토 필요}} | {{프로그래밍|검토 필요}} |
2021년 7월 30일 (금) 13:27 기준 최신판
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
참고자료[편집]
- 〈do-while루프〉, 《위키백과》
- 몽키몽키, 〈반복문(while, do~while, for) 비교 및 차이 개념잡기〉, 《네이버블로그》, 2006-05-16
- 〈(Chapter 4 반복문) 4. do-while문〉, 《티스토리》, 2019-07-08