다음을 통해 공유


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 Argument 를 참조하세요.
datatype 선택 사항입니다. 의 데이터 형식입니다 counter. 자세한 내용은 이 항목의 뒷부분에 있는 Counter Argument 를 참조하세요.
start 필수 사항입니다. 숫자 식입니다. counter의 초기 값입니다.
end 필수 사항입니다. 숫자 식입니다. 의 최종 값입니다 counter.
step 선택 사항입니다. 숫자 표현 루프를 반복할 때마다 counter가 증가하는 양입니다.
statements 선택 사항입니다. 지정된 횟수만큼 실행되는 ForNext 사이에 하나 이상의 문.
Continue For 선택 사항입니다. 제어를 다음 루프 반복으로 전송합니다.
Exit For 선택 사항입니다. For 루프에서 제어를 벗어납니다.
Next 필수 사항입니다. 루프의 정의를 종료합니다 For .

비고

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

간단한 예제

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

다음 예제에서 변수는 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에 도달한 후에 끝납니다. 인수는 Step 루프의 -.25 각 반복에서 값을 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 다음 예제에서는 단계 값이 다른 중첩된 For 구조Next를 보여 줍니다. 외부 루프는 루프의 모든 반복에 대한 문자열을 만듭니다. 내부 루프는 루프를 반복할 때마다 루프 카운터 변수를 감소합니다.

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 변수가 있어야 합니다.

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

For 루프 종료 및 계속 실행

Exit For 문장은 즉시 For을(를) 종료합니다. Next 루프를 종료하고 제어를 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

당신은 For에 임의의 수의 Exit For 구문을 넣을 수 있습니다... Next 루프. 중첩 내에서 For 사용되는 경우 ...** Next 루프를 Exit For 사용하여 가장 안쪽 루프를 종료하고 제어를 다음 상위 중첩 수준으로 전송합니다.

Exit For 는 몇 가지 조건을 평가한 후 자주 사용됩니다(예 If: ...Then...Else structure). 다음 조건에 사용할 Exit For 수 있습니다.

  • 반복을 계속하는 것은 불필요하거나 불가능합니다. 잘못된 값 또는 종료 요청이 이 조건을 만들 수 있습니다.

  • A Try...Catch...Finally 문은 예외를 처리합니다. 블록의 Finally 끝에서 사용할 Exit For 수 있습니다.

  • 무한 루프가 있습니다. 이 루프는 횟수가 크거나 무한할 수 있습니다. 이러한 조건을 감지하는 경우 루프를 이스케이프하는 데 사용할 Exit For 수 있습니다. 자세한 내용은 Do...Loop 문을 참조하세요.

기술 구현

루프가 For 시작되면 Visual Basic은 start, end, 및 step를 평가합니다. Next Visual Basic은 이 시점에서만 이러한 값을 평가한 다음 startcounter에 할당합니다. 문 블록이 실행되기 전에 Visual Basic은 counterend을 비교합니다. counterend 값보다 크거나 (step가 음수인 경우 더 작을 때), For 루프가 종료되고 제어가 Next 문 다음의 문장으로 전달됩니다. 그렇지 않으면 코드 블록이 실행됩니다.

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

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

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

루프를 중첩하는 경우, 컴파일러는 내부 수준의 Next 문이 나오기 전에 외부 중첩 수준의 Next 문이 발생하면 오류를 신호합니다. 그러나 컴파일러는 counter를 모든 Next 문에서 명시하는 경우에만 이 겹치는 오류를 검색할 수 있습니다.

단계 매개변수

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

단계 값 루프는 다음 경우에 실행됩니다.
양수 또는 0 counter <= end
부정 counter >= end

step 기본값은 1입니다.

반론

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

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

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

  • AByte, 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

필요에 따라 counter 문에서 Next 변수를 지정할 수 있습니다. 이 구문은 특히 중첩된 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

참고하십시오