For...Next 문(Visual Basic)

문 그룹을 지정된 횟수만큼 반복합니다.

구문

For counter [ As datatype ] = start To end [ Step step ]
    [ statements ]
    [ Continue For ]
    [ statements ]
    [ Exit For ]
    [ statements ]
Next [ counter ]

부분

요소 설명
counter For 문에 필요합니다. 숫자 변수입니다. 루프의 제어 변수입니다. 자세한 내용은 이 항목의 뒷부분에 있는 counter 인수를 참조하세요.
datatype 선택 사항. counter의 데이터 형식입니다. 자세한 내용은 이 항목의 뒷부분에 있는 counter 인수를 참조하세요.
start 필수입니다. 숫자 식입니다. counter의 초기 값입니다.
end 필수입니다. 숫자 식입니다. counter의 최종 값입니다.
step 선택 사항. 숫자 식입니다. 루프를 반복할 때마다 counter가 증가되는 양입니다.
statements 선택 사항. 지정된 횟수만큼 실행되는 ForNext 사이에 있는 하나 이상의 문입니다.
Continue For 선택 사항. 제어를 다음 루프 반복으로 전달합니다.
Exit For 선택 사항. 제어를 For 루프 외부로 전달합니다.
Next 필수입니다. For 루프의 정의를 종료합니다.

참고 항목

To 키워드는 이 문에서 counter의 범위를 지정하는 데 사용됩니다. Select...Case 문과 배열 선언에서도 이 키워드를 사용할 수 있습니다. 배열 선언에 대한 자세한 내용은 Dim 문을 참조하세요.

간단한 예

일련의 문을 설정된 횟수만큼 반복하려는 경우 For...Next 구조를 사용합니다.

다음 예에서 index 변수는 값 1로 시작하여 루프가 반복될 때마다 증가하고 index 값이 5에 도달한 후에 끝납니다.

For index As Integer = 1 To 5
    Debug.Write(index.ToString & " ")
Next
Debug.WriteLine("")
' Output: 1 2 3 4 5

다음 예에서 number 변수는 2로 시작하여 루프가 반복될 때마다 0.25씩 감소하고 number 값이 0에 도달한 후에 끝납니다. -.25Step 인수는 루프가 반복될 때마다 값을 0.25씩 줄입니다.

For number As Double = 2 To 0 Step -0.25
    Debug.Write(number.ToString & " ")
Next
Debug.WriteLine("")
' Output: 2 1.75 1.5 1.25 1 0.75 0.5 0.25 0 

While...End While 문 또는 Do...Loop 문은 루프에서 문을 몇 번 실행할지 미리 알 수 없을 때 사용하기 좋습니다. 그러나 루프를 특정 횟수만큼 실행해야 하는 경우 For...Next 루프를 선택하는 것이 좋습니다. 반복 횟수는 루프를 처음 입력할 때 결정합니다.

중첩 루프

하나의 루프를 다른 루프 내에 배치하여 For 루프를 중첩할 수 있습니다. 다음 예에서는 step 값이 서로 다른 중첩된 For...Next 구조를 보여줍니다. 외부 루프는 루프가 반복될 때마다 문자열을 생성합니다. 내부 루프는 루프가 반복될 때마다 루프 counter 변수를 감소시킵니다.

For indexA = 1 To 3
    ' Create a new StringBuilder, which is used
    ' to efficiently build strings.
    Dim sb As New System.Text.StringBuilder()

    ' Append to the StringBuilder every third number
    ' from 20 to 1 descending.
    For indexB = 20 To 1 Step -3
        sb.Append(indexB.ToString)
        sb.Append(" ")
    Next indexB

    ' Display the line.
    Debug.WriteLine(sb.ToString)
Next indexA
' Output:
'  20 17 14 11 8 5 2
'  20 17 14 11 8 5 2
'  20 17 14 11 8 5 2

루프를 중첩할 때 각 루프에는 고유한 counter 변수가 있어야 합니다.

서로 다른 종류의 제어 구조를 중첩할 수도 있습니다. 자세한 내용은 중첩된 제어 구조를 참조하세요.

Exit For 및 Continue For

Exit For 문은 ForNext 루프를 즉시 종료하고 Next 문 뒤에 오는 문으로 제어를 전달합니다.

Continue For 문은 루프의 다음 반복으로 즉시 제어를 전달합니다. 자세한 내용은 Continue 문을 참조하세요.

다음 예에서는 Continue ForExit For 문을 사용하는 방법을 보여 줍니다.

For index As Integer = 1 To 100000
    ' If index is between 5 and 7, continue
    ' with the next iteration.
    If index >= 5 AndAlso index <= 8 Then
        Continue For
    End If

    ' Display the index.
    Debug.Write(index.ToString & " ")

    ' If index is 10, exit the loop.
    If index = 10 Then
        Exit For
    End If
Next
Debug.WriteLine("")
' Output: 1 2 3 4 9 10

원하는 만큼의Exit For 문을 ForNext 루프에 넣을 수 있습니다. 중첩된 ForNext 루프 내에서 사용되는 경우 Exit For는 가장 안쪽 루프를 종료하고 제어를 다음 상위 수준의 중첩으로 전달합니다.

Exit For는 일부 조건(예: If...Then...Else 구조)을 평가한 후에 자주 사용됩니다. 다음 조건에서 Exit For를 사용할 수 있습니다.

  • 계속해서 반복하는 것이 불필요하거나 불가능한 경우. 잘못된 값이나 종료 요청으로 인해 이 조건이 생길 수 있습니다.

  • Try...Catch...Finally 문이 예외를 catch하는 경우. Finally 블록 끝에 Exit For를 사용할 수 있습니다.

  • 아주 많이 또는 무한히 실행될 수 있는 무한 루프가 있는 경우. 이러한 조건을 감지하면 Exit For를 사용하여 루프를 벗어날 수 있습니다. 자세한 내용은 Do...Loop 문을 참조하세요.

기술 구현

For...Next 루프가 시작되면 Visual Basic은 start, end, step을 평가합니다. Visual Basic은 이때만 이러한 값을 평가한 다음 startcounter에 할당합니다. 문 블록이 실행되기 전에 Visual Basic은 counterend와 비교합니다. counter가 이미 end 값보다 큰 경우(step이 음수일 때는 더 작은 경우) For 루프가 종료되고 제어는 Next 문 다음에 오는 문으로 전달됩니다. 그렇지 않으면 명령문 블록이 실행됩니다.

Visual Basic은 Next 문이 있을 때마다 counterstep만큼 증가시키고 For 문으로 돌아갑니다. 다시 한 번 counterend와 비교하고 결과에 따라 다시 블록을 실행하거나 루프를 종료합니다. 이 프로세스는 counterend를 통과하거나 Exit For 문을 만날 때까지 계속됩니다.

루프는 counterend를 통과할 때까지 멈추지 않습니다. counterend와 같으면 루프가 계속됩니다. 블록 실행 여부를 결정하는 비교는 step이 양수인 경우 counter<= end이고 step이 음수인 경우 counter>= end입니다.

루프 내에 있는 동안 counter 값을 변경하면 코드를 읽고 디버그하기가 더 어려울 수 있습니다. start, end 또는 step 값을 변경해도 루프를 처음 입력할 때 결정된 반복 값에는 영향을 주지 않습니다.

루프를 중첩하는 경우 컴파일러는 내부 수준의 Next 문 전에 외부 중첩 수준의 Next 문을 만나면 오류 신호를 보냅니다. 그러나 컴파일러는 모든 Next 문에 counter를 지정하는 경우에만 이 중첩 오류를 감지할 수 있습니다.

step 인수

step 값은 양수 또는 음수일 수 있습니다. 이 매개 변수는 다음 표에 따라 루프 처리를 결정합니다.

step 값 다음 경우에 루프 실행
양수 또는 0 counter<= end
부정 counter>= end

step의 기본값은 1입니다.

counter 인수

다음 표는 counter가 전체 For…Next 루프로 범위가 지정된 새 지역 변수를 정의하는지 여부를 나타냅니다. 이 결정은 datatype이 있는지 여부와 counter가 이미 정의되어 있는지 여부에 따라 달라집니다.

datatype이 있는가? counter가 이미 정의되었는가? 결과(counter가 전체 For...Next 루프로 범위가 지정된 새 지역 변수를 정의하는지 여부)
counter가 이미 정의되어 있으므로 아닙니다. counter 범위가 프로시저에 대해 로컬이 아닌 경우 컴파일 시간 경고가 발생합니다.
아니요 아니요 예. 데이터 형식은 start, end, step 식에서 유추됩니다. 형식 유추에 대한 자세한 내용은 Option Infer 문지역 형식 유추를 참조하세요.
예. 하지만 기존 counter 변수가 프로시저 외부에 정의된 경우에만 해당됩니다. 해당 변수는 별도로 유지됩니다. 기존 counter 변수의 범위가 프로시저에 대해 로컬인 경우 컴파일 시간 오류가 발생합니다.
아니요 예.

counter의 데이터 형식은 반복 형식을 결정하며 다음 형식 중 하나여야 합니다.

  • Byte, SByte, UShort, Short, UInteger, Integer, ULong, Long, Decimal, Single 또는 Double

  • Enum 문을 사용하여 선언하는 열거형

  • Object입니다.

  • 다음 연산자가 있는 T 형식(여기서 BBoolean 표현식에 사용할 수 있는 형식임)

    Public Shared Operator >= (op1 As T, op2 As T) As B

    Public Shared Operator <= (op1 As T, op2 As T) As B

    Public Shared Operator - (op1 As T, op2 As T) As T

    Public Shared Operator + (op1 As T, op2 As T) As T

필요에 따라 Next 문에 counter 변수를 지정할 수 있습니다. 이 구문은 특히 For 루프가 중첩된 경우 프로그램의 가독성을 향상시킵니다. 해당 For 문에 나타나는 변수를 지정해야 합니다.

start, end, step 식은 counter 형식으로 확장되는 모든 데이터 형식으로 평가될 수 있습니다. counter에 사용자 정의 형식을 사용하는 경우 start, end 또는 step 형식을 counter 형식으로 변환하기 위해 CType 변환 연산자를 정의해야 할 수도 있습니다.

예 1

다음 예에서는 제네릭 목록에서 모든 요소를 ​​제거합니다. For Each...Next 문 대신 이 예에서는 내림차순으로 반복되는 For...Next 문을 보여줍니다. 이 예에서는 removeAt 메서드로 인해 제거된 요소 뒤의 요소가 더 낮은 인덱스 값을 갖게 되므로 이 방법을 사용합니다.

Dim lst As New List(Of Integer) From {10, 20, 30, 40}

For index As Integer = lst.Count - 1 To 0 Step -1
    lst.RemoveAt(index)
Next

Debug.WriteLine(lst.Count.ToString)
' Output: 0

예제 2

다음 예에서는 Enum 문을 사용하여 선언된 열거형을 반복합니다.

Public Enum Mammals
    Buffalo
    Gazelle
    Mongoose
    Rhinoceros
    Whale
End Enum

Public Sub ListSomeMammals()
    For mammal As Mammals = Mammals.Gazelle To Mammals.Rhinoceros
        Debug.Write(mammal.ToString & " ")
    Next
    Debug.WriteLine("")
    ' Output: Gazelle Mongoose Rhinoceros
End Sub

예 3

다음 예에서 문 매개 변수는 +, -, >=, <= 연산자에 대한 연산자 오버로드가 있는 클래스를 사용합니다.

Private Class Distance
    Public Property Number() As Double

    Public Sub New(ByVal number As Double)
        Me.Number = number
    End Sub

    ' Define operator overloads to support For...Next statements.
    Public Shared Operator +(ByVal op1 As Distance, ByVal op2 As Distance) As Distance
        Return New Distance(op1.Number + op2.Number)
    End Operator

    Public Shared Operator -(ByVal op1 As Distance, ByVal op2 As Distance) As Distance
        Return New Distance(op1.Number - op2.Number)
    End Operator

    Public Shared Operator >=(ByVal op1 As Distance, ByVal op2 As Distance) As Boolean
        Return (op1.Number >= op2.Number)
    End Operator

    Public Shared Operator <=(ByVal op1 As Distance, ByVal op2 As Distance) As Boolean
        Return (op1.Number <= op2.Number)
    End Operator
End Class

Public Sub ListDistances()
    Dim distFrom As New Distance(10)
    Dim distTo As New Distance(25)
    Dim distStep As New Distance(4)

    For dist As Distance = distFrom To distTo Step distStep
        Debug.Write(dist.Number.ToString & " ")
    Next
    Debug.WriteLine("")

    ' Output: 10 14 18 22 
End Sub

참고 항목