Do-while 루프

섬네일|Do-while 루프 도식
**do-while 루프**는 대부분의 컴퓨터 프로그래밍 언어에서 주어진 불리언 자료형 조건을 기반으로 코드가 한 번 실행할 수 있게 하는 제어 흐름문이다. 대부분의 언어와 달리 포트란의 do 루프는 실제로는 for 루프와 같다.

많은 컴퓨터 프로그래밍 언어에서 do while 루프는 코드 블록을 실행한 다음 주어진 부울 조건에 따라 블록을 반복하거나 루프를 종료하는 제어 흐름 문이다.

do while 구조는 프로세스 기호와 조건으로 구성된다. 먼저 블록 내의 코드가 실행된다. 그런 다음 조건이 평가된다. 조건이 true이면 블록 내의 코드가 다시 실행된다. 이는 조건이 거짓이 될 때까지 반복된다.

while 루프는 코드 블록이 실행된 후 조건을 확인한다. 이 제어 구조는 테스트 후 루프로 알려져 있다. 이는 do-while 루프가 종료 조건 루프임을 의미한다. 그러나 while 루프는 블록 내의 코드가 실행되기 전에 조건을 테스트한다.

즉, 항상 코드가 먼저 실행된 다음 표현식이나 테스트 조건이 평가된다. 이 프로세스는 표현식이 true로 평가되는 한 반복된다. 표현식이 거짓이면 루프가 종료된다. while 루프는 명령문의 진실성을 코드 실행에 필요한 조건으로 설정한다. do-while 루프는 조건이 더 이상 참이 아닐 때까지 작업이 계속 실행되도록 한다.

조건이 항상 참으로 평가되는 것이 가능하며 때로는 바람직할 때도 있다. 이로 인해 무한 루프가 생성된다. 무한 루프가 의도적으로 생성되면 일반적으로 루프 종료를 허용하는 또 다른 제어 구조가 있다. 예를 들어, break 문을 사용하면 무한 루프를 종료할 수 있다.

일부 언어에서는 이러한 유형의 루프에 대해 다른 명명 규칙을 사용할 수 있다. 예를 들어 Pascal 및 Lua 언어에는 제어 표현식이 true가 될 때까지 계속 실행된 다음 종료되는 "repeat Until" 루프가 있다. 대조적으로 "while" 루프는 제어 표현식이 true인 동안 실행되고 표현식이 false가 되면 종료된다.

## 구조체
아래의 소스는

```c
do {
   do_work();
} while (condition);
```


"continue" 문이 사용되지 않는 한 다음과 같으며


```c
do_work();
while (condition) {
   do_work();
}
```


기술적으로는 다음과 동등하다:


```c
while (true) {
   do_work();
   if (!condition) break;
}
```


또는


```c
LOOPSTART:
   do_work();
   if (condition) goto LOOPSTART;
```


## 예제
### C

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


### C#

```csharp
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

```actionscript3
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 문이 추가되었다.

```fortran
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
<?php
$counter = 5;
$factorial = 1;
do {
     $factorial *= $counter--;
} while ($counter > 0);
echo $factorial;
?>
```


### PL/I
아래는 do until 문법만을 보여준다.


```
declare counter   fixed initial(5);
declare factorial fixed initial(1);
do until(counter<=0);
  factorial = factorial * counter;
  counter = counter - 1;
  end;
put(factorial);
```


### 래킷

```scheme
#lang racket
(define counter 5)
(define factorial 1)
(let loop ()
  (set! factorial (* factorial counter))
  (set! counter (sub1 counter))
  (when (> counter 0) (loop)))
(displayln factorial)
```


### 루비

```ruby
counter = 5
factorial = 1
begin
  factorial *= counter
  counter -= 1
end while counter > 0
puts factorial
```


### 스몰토크

```smalltalk
| counter factorial |
counter := 5.
factorial := 1.
[counter > 0] whileTrue:
  [factorial := factorial * counter.
  counter := counter - 1].
Transcript show: factorial printString
```


### 비주얼 베이직 닷넷

```vbnet
Dim counter As Integer = 5
Dim factorial As Integer = 1
Do
   factorial *= counter
   counter -= 1
Loop While counter > 0
Console.WriteLine(factorial)
```


## 같이 보기
* for 루프
* foreach
* while 루프
* 제어 흐름

## 참조


분류:제어 흐름