Python에서 Do-While 루프를 에뮬레이트하는 방법

이 튜토리얼에서는 파이썬에서 do-while 반복문을 구현하는 다양한 방법에 대해 알아보겠습니다.

거의 모든 프로그래밍 언어에서 반복문은 특정 조건에 따라 일련의 작업을 반복적으로 수행하는 데 매우 유용합니다. 파이썬은 while 및 for 루프를 제공하지만, do-while 루프는 기본적으로 지원하지 않습니다.

하지만 파이썬에서 제공하는 기존 루프와 루프 제어 구문을 적절히 활용하여 do-while 루프와 유사한 동작을 만들 수 있습니다. 즉, 파이썬으로 do-while 루프를 ‘에뮬레이션’할 수 있습니다.

이 튜토리얼에서는 바로 그 방법을 살펴볼 것입니다. 자, 시작해 볼까요!

Do-While 루프란 무엇일까요?

만약 C나 C++ 같은 언어로 프로그래밍 경험이 있다면 do-while 루프 구조에 익숙할 것입니다.

do-while 루프에서는 루프 본문에 해당하는 코드 블록이 먼저 한 번 실행된 다음, 루프의 조건이 평가됩니다. 이 구조의 핵심은 조건이 처음부터 거짓(false)이더라도 코드 블록이 최소 한 번은 실행된다는 점입니다.

아래 예제는 온라인 C 컴파일러를 사용하여 koreantech.org에서 직접 실행해 볼 수 있습니다.

다음 코드를 살펴보세요.

//do_while_example1
    #include <stdio.h>
    int main() {
        int count = 1;
        printf("Do-While loop: n");
        do{
            printf("Loop runs...");
            }while(count<0);
        return 0;
    }
    

출력 결과는 다음과 같습니다.

Output
    Do-While loop: 
    Loop runs...
    

위의 예시에서:

  • count 변수의 초기값은 1이며, 루프 조건은 count < 0 입니다. 조건이 처음부터 거짓이지만, 루프는 한 번 실행됩니다.
  • 이는 조건이 참(true)일 때만 실행되는 일반적인 while 루프와 대조됩니다.
//while_example1
    #include <stdio.h>
    int main() {
        int count = 1;
        printf("While loop: n");
        while(count<0){
            printf("Loop runs...");
            }
        return 0;
    }
    

위에서 언급했듯이, 반복 조건 count < 0은 처음 count 변수가 1로 초기화되면서 거짓이 됩니다. 따라서 위의 코드를 컴파일하고 실행하면 while 루프 본문의 코드는 실행되지 않습니다.

Output
    While loop: 
    //loop body does not run!
    

While 루프와 Do-While 루프: 차이점 비교

이제 while 루프와 do-while 루프의 차이점을 좀 더 자세히 살펴보겠습니다.

다음 예제를 고려해 봅시다.

//do_while_example2
    #include <stdio.h>
    int main() {
        int count = 1;
        printf("Do-while loop: n");
        do{
           printf("%dn",count);
           count++;
        }while(count<5);
        return 0;
    }
    

위의 코드에서:

  • count 변수는 1로 초기화됩니다.
  • do-while 루프가 사용됩니다.
  • 루프를 실행할 때마다 count 변수는 1씩 증가하며, 루프 조건은 count < 5 로 설정됩니다.

다음은 do-while 루프가 어떻게 동작하고, 루프 조건을 4번 검사하는지를 보여주는 시각적인 설명입니다.

Output
    Do-while loop: 
    1
    2
    3
    4
    

반면, 같은 작업을 while 루프로 수행하면 다음과 같습니다.

//while_example2
    #include <stdio.h>
    int main() {
        int count = 1;
        printf("While loop: n");
        while(count<5){
           printf("%dn",count);
           count++;
        };
        return 0;
    }
    

아래 그림은 while 루프의 실행 과정을 보여줍니다. 이 예제에서는 while 루프가 반복 조건을 5번 검사합니다.

Output
    While loop: 
    1
    2
    3
    4
    

위의 while 및 do-while 루프 출력은 동일하지만, 두 루프 사이에는 중요한 차이점이 있습니다.

while 루프에서는 조건 검사가 먼저 수행되고, 루프 본문이 실행됩니다. 따라서 루프가 K번 실행되려면 루프 조건이 참이어야 하며, K번 반복 후에 조건이 거짓이 되면 루프를 종료합니다.

반면 do-while 루프는 루프 본문의 코드를 한 번 실행한 다음 조건을 검사합니다. 이는 조건 검사가 루프 실행의 마지막 단계라는 것을 의미합니다.

그렇다면 이 미묘한 차이가 왜 중요할까요? 🤔

만약 루프 조건 검사가 복잡한 연산(예: 재귀 함수 호출, 복잡한 수학 계산)을 포함하여 비용이 많이 드는 작업이라고 가정해 봅시다.

이러한 상황에서는 루프 본문을 K번 실행해야 할 때, do-while 루프가 while 루프보다 효율적일 수 있습니다. do-while 루프는 조건 검사를 한 번 적게 수행하기 때문입니다.

While 루프 vs. Do-While 루프 요약

지금까지 배운 주요 차이점을 표로 정리해 보겠습니다. 👩‍🏫

While 루프 Do-While 루프
루프 조건 검사 시점 루프 본문 실행 전 루프 본문 실행 후
초기 조건이 거짓일 경우 루프 본문이 실행되지 않음 루프 본문이 정확히 한 번 실행됨
루프 조건 검사 횟수 (K번 루프 실행 시) K 번 K-1 번
사용 시나리오
  • 조건이 참인 동안 루프를 실행해야 하는 경우
  • 진입 제어 루프가 필요한 경우
  • 루프 조건 계산 비용이 저렴한 경우
  • 루프가 초기 조건이 거짓이더라도 최소 한 번은 실행되어야 하는 경우
  • 출구 제어 루프가 필요한 경우
  • 루프 조건 계산 비용이 높은 경우

파이썬에서 Do-While 루프 동작을 에뮬레이션하기

이전 섹션에서 do-while 루프를 에뮬레이트하기 위한 두 가지 중요한 조건을 확인했습니다:

  • 루프 본문의 명령문은 루프 조건이 참이든 거짓이든 상관없이 최소 한 번은 실행되어야 합니다.
  • 루프 본문에서 명령문을 실행한 후 조건을 확인해야 합니다. 조건이 거짓이면 루프를 종료해야 합니다.

파이썬의 무한 While 루프 및 break 문

다음과 같이 파이썬에서 무한 while 루프를 정의할 수 있습니다:

while True:
        pass
    # True 대신 항상 참이 되는 다른 조건을 사용할 수도 있습니다.
    while always-True-condition:
       pass
    

break 문을 사용하여 루프 본문에서 즉시 빠져나와 루프 외부의 첫 번째 문으로 제어를 이동시킬 수 있습니다.

while <condition>:
        if <some-condition>:
            break
    

C 언어의 첫 번째 do-while 루프 예제에서, 루프를 계속하기 위한 조건은 count < 0 이었습니다. 따라서 루프를 빠져나오는 조건은 count 값이 0 이상인 경우(count >= 0)입니다.

다음은 파이썬에서 do-while 루프를 에뮬레이트한 예시입니다.

count = 1
    while True:
        print("Loop runs...")
        if(count >= 0):
            break
    

파이썬 Do-While 루프 예제

이전 섹션의 예제를 다시 살펴보면서, do-while 루프를 에뮬레이트하여 파이썬으로 다시 작성해 보겠습니다.

#1. count 변수가 5보다 작을 때, 해당 값을 출력하는 예제입니다.

루프 본문이 최소 한 번은 실행되도록 무한 루프를 정의하는 방법을 배웠습니다.

카운트 값이 5보다 작은 동안 반복이 계속되어야 하며, 카운트가 5에 도달하면 루프를 종료해야 합니다. 따라서 count == 5는 루프를 빠져나오는 조건이 됩니다.

이를 종합하여 코드를 작성하면 다음과 같습니다:

count = 1
    while True:
        print(f"Count is {count}")
        count += 1
        if count==5:
            break
    
Output
    Count is 1
    Count is 2
    Count is 3
    Count is 4
    

#2. 숫자 추측 게임을 파이썬의 do-while 루프 구문을 사용하여 다시 작성할 수도 있습니다.

숫자 추측 게임에서는 미리 정의된 비밀 숫자에 대한 사용자의 추측을 검증합니다. 사용자는 허용된 최대 시도 횟수(예: max_guesses) 내에서 비밀 번호를 추측해야 합니다.

코드는 추측이 맞든 틀리든 사용자에게 입력을 요청해야 합니다. 무한 while 루프를 사용하여 이를 수행할 수 있습니다.

그렇다면 언제 루프를 빠져나와야 할까요?

다음 중 하나가 발생하면 루프에서 빠져나와야 합니다:

  • 사용자가 숫자를 정확히 추측했을 때
  • 사용자가 숫자를 추측하지 못했지만, 허용된 최대 추측 횟수를 모두 사용했을 때(사용자의 틀린 추측 횟수 = max_guesses).

아래 코드는 위 조건을 어떻게 처리하는지 보여줍니다.

import random
    low, high = 5,50
    secret_number = random.choice(range(low,high))
    max_guesses = 10
    num_guesses = 0
    while True:
        guess = int(input("nGuess a number:"))
        num_guesses += 1
        conditions = [num_guesses==max_guesses,guess==secret_number]
        if any(conditions):
            break
    

루프를 빠져나가는 대신, 각 조건을 충족시킨 후 루프를 빠져나올 때, 상황에 맞는 설명을 출력하는 print() 문을 추가할 수 있습니다.

import random
    low, high = 5,50
    secret_number = random.choice(range(low,high))
    print(secret_number)
    max_guesses = 10
    num_guesses = 0
    while True:
        guess = int(input("nGuess a number:"))
        num_guesses += 1
        if guess==secret_number:
            print("Congrats, you guessed it right!")
            break
        if num_guesses==max_guesses:
            print("Sorry, you have no more guesses left!")
            break
    

아래는 실행 결과의 두 가지 예시입니다.

이 첫 번째 예시에서는 사용자가 비밀 숫자를 맞추었을 때 break 문을 사용하여 루프를 종료합니다.

# Sample output when secret_number = 43 and user gets it right!
    Guess a number:4
    Guess a number:3
    Guess a number:43
    Congrats, you guessed it right!
    

다음은 사용자가 최대 추측 횟수에 도달했지만, 비밀 번호를 맞추지 못했을 때의 예시입니다.

# Sample output when secret_number = 33 and user fails to guess it right!
    Guess a number:3
    Guess a number:15
    Guess a number:21
    Guess a number:50
    Guess a number:17
    Guess a number:6
    Guess a number:18
    Guess a number:5
    Guess a number:12
    Guess a number:43
    Sorry, you have no more guesses left!
    

결론

이 튜토리얼이 파이썬에서 do-while 루프를 에뮬레이트하는 방법을 이해하는 데 도움이 되었기를 바랍니다.

핵심 내용은 다음과 같습니다:

  • 무한 루프를 사용하여 루프 본문이 최소 한 번 실행되도록 합니다. while True와 같은 간단한 무한 루프를 사용하거나, 조건이 항상 참이 되는 while <condition> 형식을 사용할 수 있습니다.
  • 루프 내부에서 종료 조건을 확인하고, break 문을 사용하여 특정 조건에서 루프를 종료합니다.

다음 튜토리얼에서는 파이썬에서 for 루프와 enumerate() 함수를 사용하는 방법을 배우도록 하겠습니다.