맨위로가기

Do-while 루프

"오늘의AI위키"는 AI 기술로 일관성 있고 체계적인 최신 지식을 제공하는 혁신 플랫폼입니다.
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.

1. 개요

do-while 루프는 프로그래밍 언어에서 사용되는 반복 제어 구조의 한 종류이다. 코드 블록을 먼저 실행한 후 조건을 평가하여, 조건이 참인 동안 코드 블록을 반복 실행한다. do-while 루프는 break 문을 사용하여 종료할 수 있으며, C/C++에서는 매크로 정의에 유용하게 사용된다. 다양한 프로그래밍 언어에서 do-while 루프 또는 유사한 기능을 제공하며, 팩토리얼 계산과 같은 예제를 통해 활용법을 확인할 수 있다.

더 읽어볼만한 페이지

  • 제어 흐름 - 프로그램 카운터
    프로그램 카운터는 CPU 내에서 다음에 실행될 명령어의 주소를 저장하는 레지스터로, 명령어 사이클의 fetch 단계에서 사용되어 명령어를 가져오고 실행 후 갱신되며, CPU 성능 향상 기술과 현대 프로그래밍 모델에 영향을 미친다.
  • 제어 흐름 - 예외 처리
    예외 처리는 프로그램 실행 중 예외 발생 시 정상적인 실행 흐름을 유지하거나 안전하게 종료하기 위한 메커니즘으로, 많은 프로그래밍 언어에서 제공하며 예외 안전성을 목표로 한다.
  • 프로그래밍 구성체 - 형 변환
    형 변환은 프로그래밍에서 변수의 데이터 타입을 변경하는 것으로, 암시적 형 변환과 명시적 형 변환으로 나뉘며, 객체 지향 프로그래밍에서는 업캐스팅과 다운캐스팅이 발생하고, 각 언어는 고유한 규칙과 방법을 제공하며 잘못된 형 변환은 오류를 유발할 수 있다.
  • 프로그래밍 구성체 - 연산자 오버로딩
    연산자 오버로딩은 프로그래밍 언어에서 기존 연산자를 사용자 정의 자료형에 대해 재정의하여 내장 자료형처럼 다루도록 하는 기능으로, 코드 가독성과 표현력을 높이지만 남용 시 코드 의미를 모호하게 만들 수 있다.
Do-while 루프
정의
설명특정 조건이 참이 될 때까지 코드 블록을 반복적으로 실행하는 제어 흐름 문이다.
종류선 검사 루프: while 루프
후 검사 루프: do-while 루프
동작 방식
do 블록 실행먼저 do 블록 안의 코드를 실행한다.
조건 검사while 문의 조건식을 평가한다.
조건이 참인 경우조건이 참이면 do 블록을 다시 실행한다.
조건이 거짓인 경우조건이 거짓이면 루프를 종료하고 다음 코드를 실행한다.
특징
최소 실행 횟수do 블록은 최소 한 번은 실행된다.
조건 검사 시점루프의 마지막에 조건을 검사한다.
사용 예시 (C++)
기본적인 do-while 루프

| std::cout << i << std::endl;

사용자 입력 검증

| std::cout << "양수를 입력하세요: ";
| std::cin >> number;
메뉴 선택

| std::cout << "메뉴:" << std::endl;
| std::cout << "1. 항목 1" << std::endl;
| std::cout << "2. 항목 2" << std::endl;
| std::cout << "0. 종료" << std::endl;
| std::cout << "선택: ";
| std::cin >> choice;

주의 사항
무한 루프조건이 항상 참이면 무한 루프에 빠질 수 있으므로 주의해야 한다.
세미콜론while 문 뒤에 반드시 세미콜론(;)을 붙여야 한다.
다른 언어에서의 do-while
C 언어C 언어에서도 동일한 do-while 문을 사용할 수 있다.
C++ 언어C++ 언어에서도 동일한 do-while 문을 사용할 수 있다.
JavaJava에서도 동일한 do-while 문을 사용할 수 있다.
일본어 (Do-while文)
구문

의미처리를 실행한 후, 조건식이 참인 동안 처리를 반복한다. 조건식이 거짓이 되면 do-while 문을 종료한다.
특징조건식의 평가가 처리가 실행된 후에 이루어지므로, 처리는 반드시 한 번 이상 실행된다.
주의점while() 뒤에 반드시 세미콜론(;)을 붙인다.
한국어 (Do-while 루프)
설명조건이 충족될 때까지 코드 블록을 반복적으로 실행하는 제어 흐름 구조이다. "Post-test loop"라고도 한다.
특징루프 본문이 최소 한 번은 실행된다.
조건은 루프 본문 실행 후에 평가된다.

2. 구조체

do-while 문의 기본 구조는 다음과 같다. 먼저 코드 블록이 실행된 후, 조건이 평가된다. 조건이 참이면 코드 블록이 다시 실행되고, 거짓이면 반복문이 종료된다. 이는 `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

do

문 /* 이 부분을 "루프 본체"라고 부른다 */

while (조건);

```

이 루프의 실행은 다음과 같은 절차를 따른다.

1. "문"을 실행한다.

2. "조건"을 평가한다.

3. "조건"이 참이면, 절차의 처음으로 돌아간다. "조건"이 거짓이면, 루프를 종료한다.

"조건"이 처음부터 거짓인 경우에도, "문"은 한 번 실행된다.

루프 본체가 여러 문으로 구성된 경우, 블록 (복문)을 사용한다.

```c

do {

...

} while (조건);

3. 분기문

`while` 문과 마찬가지로 `do-while` 문에서도 break 문을 사용하여 반복문을 종료하거나, continue 문을 사용하여 조건 평가 부분으로 이동할 수 있다.[5]

4. C/C++ 매크로에서의 활용

C/C++에서 `do-while(0)` 문은 매크로를 정의할 때 주로 사용된다. 이 방법은 여러 문장을 안전하게 묶어주고, 함수 호출과 비슷한 형태로 사용할 수 있게 해준다.[1] `if` 문 등과 함께 사용할 때 발생할 수 있는 범위 문제를 예방하고, 코드 가독성을 높여준다.[1]

```c

/* 두 값 x, y를 교환하는 매크로 */

#define SWAP(x, y, tmp) do { (tmp) = (x); (x) = (y); (y) = (tmp); } while (0)

```

위 코드는 `SWAP` 매크로를 `do-while(0)` 구조를 사용하여 정의한다. `x`와 `y` 값을 교환하는 여러 문장이 하나의 블록으로 묶인다.

```c

void some_function()

{

int x, y, tmp;

...

if (x > y)

SWAP(x, y, tmp);

else

puts("Not swapped.");

...

}

```

`if` 문과 함께 `SWAP` 매크로를 사용할 때, `do-while(0)` 구조는 중괄호(`{}`) 없이도 매크로가 올바르게 작동하도록 돕는다. `do-while(0)` 없이 매크로를 정의하면, `if-else` 문에서 예상치 못한 동작이 발생할 수 있다.

이러한 방식을 사용하면 "세미콜론을 붙이면 안 되는 매크로"와 같이 다루기 어려운 문제를 피할 수 있다.

5. 예제

이 예제 프로그램들은 각 언어의 do-while 루프 구문(또는 그와 유사한 기능)을 사용하여 5의 팩토리얼을 계산한다.

C 언어, C++(C++), D 언어, C#, 자바, 자바스크립트, PHP, , PL/I, Visual Basic .NET, Ada, 포트란, 파스칼, Racket, 스몰토크, 파이썬 등 다양한 프로그래밍 언어에서 do-while 문 (또는 이와 유사한 기능)을 사용하는 방법은 하위 섹션을 참고할 수 있다.

5. 1. C, C++, D

c

unsigned int counter = 5;

unsigned long factorial = 1;

do {

factorial *= counter--; /* 곱하고, 감소시킨다. */

} while (counter > 0);

printf("%lu\n", factorial);

```

C 언어와 C++(C++)의 예시이다.

```d

uint counter = 5;

ulong factorial = 1;

do {

factorial *= counter--;

} while (counter > 0);

writeln(factorial);

```

D 언어의 예시이다.

do-while(0) 문은 여러 개의 문을 일반 문(복합문이 아닌)으로 묶는 방법으로 C 매크로에서 흔히 사용된다. 매크로 뒤에 세미콜론이 필요하도록 하여 간단한 파서와 프로그래머에게 함수와 유사한 모양을 제공하고, `if`문과 관련된 범위 문제를 피할 수 있다. 이는 CERT C 코딩 표준 규칙 PRE10-C에서 권장된다.[1]

5. 2. C#

csharp

uint counter = 5;

ulong factorial = 1;

do

{

factorial *= counter--;

}

while (counter > 0);

System.Console.WriteLine(factorial);

```

C#의 예시이다.

5. 3. Java

java

int counter = 5;

int factorial = 1;

do {

factorial *= counter--; // 곱한 다음 감소

} while (counter > 0);

System.out.println("5의 팩토리얼은 " + factorial + "입니다.");

```

자바의 예시.

5. 4. 자바스크립트

javascript

var counter = 5;

var factorial = 1;

do {

factorial *= counter--;

} while (counter > 0);

console.log(factorial);

```[7]

5. 5. PHP

php


$counter = 5;

$factorial = 1;

do {

$factorial *= $counter--;

} while ($counter > 0);

echo $factorial;

?>

```[8]

5. 6. 펄

perl

$counter = 5;

$factorial = 1;

do {

$factorial *= $counter--;

} while ($counter > 0);

print $factorial;

```

코드는 다음과 같다.

```text



$counter = 5;

$factorial = 1;

do {

$factorial *= $counter--;

} while ($counter > 0);

print $factorial;



```

에서 `` 와 `` 를 제거하여 출력하였다.

5. 7. PL/I

rexx

declare counter fixed initial(5);

declare factorial fixed initial(1);

do until(counter <= 0);

factorial = factorial * counter;

counter = counter - 1;

end;

put(factorial);

```[1]

5. 8. Visual Basic .NET

vbnet

Dim counter As UInteger = 5

Dim factorial As ULong = 1

Do

factorial *= counter ' 곱하기

counter -= 1 ' 감소

Loop While counter > 0

System.Console.WriteLine(factorial)

5. 9. Ada

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 Main;

```

Ada의 예.

5. 10. 포트란

포트란 90 이후 iteration count가 없는 형태의 do 문과 do while 문이 추가되었다.[2]

다음은 iteration count가 없는 do 문의 예시이다.

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

```

다음은 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

```

구형 '''포트란 77'''에는 DO-WHILE 구문이 없지만 GOTO를 사용하여 동일한 효과를 얻을 수 있다.[2]

```fortran

INTEGER CNT,FACT

CNT=5

FACT=1

1 CONTINUE

FACT=FACT*CNT

CNT=CNT-1

IF (CNT.GT.0) GOTO 1

PRINT*,FACT

END

5. 11. 파스칼

파스칼은 do-while 대신 repeat-until 구문을 사용한다.[1]

```pascal

factorial := 1;

counter := 5;

repeat

factorial := factorial * counter;

counter := counter - 1; // Object Pascal에서는 dec (counter)를 사용할 수 있습니다.

until counter = 0;

5. 12. Racket

Racket은 다른 Scheme 구현과 마찬가지로 "named-let"을 사용하여 루프를 구현하는 것이 일반적이다.

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

```

위 코드는 Racket의 while 루프 예제의 첫 번째 예시와 비교했을 때, named let은 인수를 취할 수 있다는 점이 다르다.

Racket과 Scheme은 적절한 do 루프 또한 제공한다.

```scheme

(define (factorial n)

(do ((counter n (- counter 1))

(result 1 (* result counter)))

((= counter 0) result) ; 정지 조건 및 반환 값.

; do-loop의 본문은 비어 있습니다.

))

5. 13. 스몰토크

smalltalk

| counter factorial |

counter := 5.

factorial := 1.

[counter > 0] whileTrue:

[factorial := factorial * counter.

counter := counter - 1].

Transcript show: factorial printString

5. 14. 파이썬

파이썬에는 명시적인 do-while 문이 없지만, 무한 루프와 `break` 문을 사용하여 동일한 효과를 낼 수 있다.

```python

factorial = 1

counter = 5

while True:

factorial *= counter

counter -= 1

if counter < 1:

break

print(factorial)

참조

[1] 웹사이트 C multi-line macro: do/while(0) vs scope block https://stackoverflo[...]
[2] 웹사이트 Microsoft visual basic https://msdn.microso[...] 2016-01-21
[3] 문서 JIS X 3010:2003「プログラム言語C」§6.8.5.2「do文」
[4] 문서 JIS X 3010:2003「プログラム言語C」§6.8.5「繰返し文」
[5] 문서 JIS X 3010:2003「プログラム言語C」§6.8.6.2「continue文」
[6] 웹사이트 PRE10-C. 複数の文からなるマクロは do-while ループで包む https://www.jpcert.o[...]
[7] 웹인용 Mozilla Developer Network Documentation - The Do While Loop in JavaScript https://developer.mo[...]
[8] 웹인용 Do While - Official PHP Documentation http://php.net/manua[...]



본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.

문의하기 : help@durumis.com