본문 바로가기
언어 참조

Do...Loop 문

2023. 8. 5.

이 글은 도움말을 번역한 글입니다.

Do...Loop 문

조건이 True인 동안 또는 조건이 True가 될 때까지 문 블록을 반복합니다.

Syntax
Do [{ While | Until } condition ] [ statements ] [ Exit Do ] [ statements ] Loop

또는 다음 구문을 사용할 수 있습니다.

Do [ statements ] [ Exit Do ] [ statements ] Loop [{ While | Until } condition ]

condition : 선택 사항입니다. True 또는 False인 숫자 식 또는 문자열 식입니다. 조건이 Null이면 조건은 False로 처리됩니다.

statements : 조건이 True인 동안 또는 조건이 True가 될 때까지 반복되는 하나 이상의 문입니다.

조건이 True인 동안 문 반복

While 키워드를 사용하여 Do...Loop 문에서 조건을 확인하는 방법에는 두 가지가 있습니다. 루프에 들어가기 전에 조건을 확인하거나 루프가 한 번 이상 실행된 후에 조건을 확인할 수 있습니다

다음 프로시저에서는 루프에 들어가기 전에 조건을 확인합니다. 20 대신 9로 설정하면 루프 내부의 문이 실행되지 않습니다. 프로시저에서 루프 내부의 문은 조건이 False가 되기 전에 한 번만 실행됩니다.

Sub ChkFirstWhile()
    Dim counter As Integer
    Dim myNum As Integer
    counter = 0
    myNum = 9
    Do While myNum > 10
        myNum = myNum - 1
        counter = counter + 1
    Loop
    Debug.Print "The loop made " & counter & " repetitions."
End Sub

' 출력 결과
' The loop made 10 repetitions.

다음 프로시저는 조건이 False가 되기 전까지 루프 내부의 문장이 실행됩니다. 하지만 최초 실행 시 조건을 만족하지 않더라도 루프는 최소한 한 번은 실행되며, 그 후에 조건을 평가하여 루프를 더 실행할지 결정합니다.

Sub ChkLastWhile()
    Dim counter As Integer
    Dim myNum As Integer
    counter = 0
    myNum = 9
    Do
        myNum = myNum - 1
        counter = counter + 1
    Loop While myNum > 10
    Debug.Print "The loop made " & counter & " repetitions."
End Sub

' 출력 결과
' The loop made 1 repetitions.

조건이 True가 될 때까지 문 반복

Until 키워드를 사용하여 Do...Loop 문에서 조건을 확인하는 방법에는 두 가지가 있습니다. 프로시저에 표시된 방법처럼 루프에 진입하기 전에 조건을 확인하거나, 루프가 최소한 한 번 이상 실행된 후에 조건을 확인할 수 있습니다. 조건이 False로 유지되는 한 루프는 계속됩니다.

Sub ChkFirstUntil()
    Dim counter As Integer
    Dim myNum As Integer
    counter = 0
    myNum = 20
    Do Until myNum = 10
        myNum = myNum - 1
        counter = counter + 1
    Loop
    Debug.Print "The loop made " & counter & " repetitions."
End Sub
' 출력 결과
' The loop made 10 repetitions.

Sub ChkLastUntil()
    Dim counter As Integer
    Dim myNum As Integer
    counter = 0
    myNum = 1
    Do
        myNum = myNum + 1
        counter = counter + 1
    Loop Until myNum = 10
    Debug.Print "The loop made " & counter & " repetitions."
End Sub

' 출력 결과
' The loop made 9 repetitions.

루프 내부에서 Do...Loop 문을 종료하는 방법

Exit Do 문을 사용하여 Do...Loop를 종료할 수 있습니다. 예를 들어 무한 루프를 종료하려면 If...Then...Else 문이나 Select Case 문의 True 블록에서 Exit Do 문을 사용합니다. 조건이 False인 경우 루프는 평상시와 같이 실행됩니다.

다음 예제에서는 무한 루프를 생성하는 값이 할당되어 있습니다. If...Then...Else 문은 이 조건을 검사한 다음 종료하여 무한 루프를 방지합니다.

Sub ExitExample()
    Dim counter As Integer
    Dim myNum As Integer
    counter = 0
    myNum = 9
    Do Until myNum = 10
        myNum = myNum - 1
        counter = counter + 1
        If myNum < 10 Then Exit Do
    Loop
    Debug.Print "The loop made " & counter & " repetitions."
End Sub

' 출력 결과
' The loop made 1 repetitions.

Note

무한 루프를 중지하려면 Esc 또는 Ctrl+Break를 누릅니다.

비고

Do...Loop를 종료하는 다른 방법으로 Do...Loop의 아무 곳에나 Exit Do 문을 얼마든지 배치할 수 있습니다. Exit Do는 종종 If...Then과 같이 일부 조건을 평가한 후에 사용되며, 이 경우 Exit Do 문은 Loop 바로 뒤에 있는 문으로 제어를 전송합니다.

중첩된 Do...Loop 문 내에서 사용되는 경우 Exit Do는 Exit Do가 발생하는 루프보다 한 중첩된 수준 위에 있는 루프로 제어를 전송합니다.

예제

이 예에서는 Do...Loop 문을 사용하는 방법을 보여 줍니다. 내부 Do...Loop 문은 10회 반복하고, 사용자에게 계속 진행할지 묻고, No를 선택하면 플래그 값을 False로 설정한 다음 Exit Do 문을 사용하여 조기에 종료합니다. 외부 루프는 플래그 값을 확인하는 즉시 종료됩니다.

Public Sub LoopExample()
    Dim Check As Boolean, Counter As Long, Total As Long
    Check = True: Counter = 0: Total = 0 ' Initialize variables.
    Do ' Outer loop.
        Do While Counter < 20 ' Inner Loop
            Counter = Counter + 1 ' Increment Counter.
            If Counter Mod 10 = 0 Then ' Check in with the user on every multiple of 10.
                Check = (MsgBox("Keep going?", vbYesNo) = vbYes) ' Stop when user click's on No
                If Not Check Then Exit Do ' Exit inner loop.
            End If
        Loop
        Total = Total + Counter ' Exit Do Lands here.
        Counter = 0
    Loop Until Check = False ' Exit outer loop immediately.
    Debug.Print "Counted to: " & Total
End Sub

'언어 참조' 카테고리의 다른 글

조건부 컴파일 이해  (0) 2023.08.05
With 문  (0) 2023.08.05
For Each...Next 문  (0) 2023.08.04
For...Next 문  (0) 2023.08.04
인수를 효율적으로 전달하기  (0) 2023.08.04