For...Next 문(Visual Basic)

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

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

구성 요소

파트

설명

counter

For 문에서 필수적 요소입니다. 숫자 변수이며 루프에 대한 제어 변수입니다.

datatype

counter가 아직 선언되지 않은 경우 필수적 요소입니다. counter의 데이터 형식입니다.

start

필수적 요소로서, 숫자 식입니다. counter의 초기 값입니다.

end

필수적 요소로서, 숫자 식입니다. counter의 최종 값입니다.

step

선택적 요소로서, 숫자 식입니다. 루프가 실행될 때마다 counter가 증가되는 정도입니다.

statements

선택적 요소로서, 지정한 횟수만큼 실행되는 For와 Next 사이의 하나 이상의 문입니다.

Continue For

선택적 요소로서, 제어를 다음 루프 반복으로 이동합니다.

Exit For

선택적 요소로서, For 루프의 외부로 제어를 이동합니다.

Next

필수적 요소로서, For 루프의 정의를 끝냅니다.

참고

To 키워드는 카운터의 범위를 지정하기 위해 여기에 사용됩니다. 또한 이 키워드는 Select...Case 문(Visual Basic) 및 배열 선언에서 값 범위를 지정하는 데 사용됩니다. 배열 선언에 대한 자세한 내용은 Dim 문(Visual Basic)을 참조하십시오.

설명

일련의 문을 특정 횟수만큼 반복하려면 For...Next 구조를 사용합니다.

For...Next 루프가 시작되면 Visual Basic에서 start, end 및 step을 계산합니다. 이번에만 이러한 값을 평가합니다. 그런 다음 counter에 start를 할당합니다. 문 블록을 실행하기 전에 counter와 end를 비교하고 counter가 이미 end 값보다 큰 경우(step가 음인 경우는 더 작은 경우) For 루프가 종료되고 제어가 Next 문 다음 문으로 전달됩니다. 그렇지 않은 경우 문 블록이 실행됩니다.

Visual Basic에서 Next 문을 만날 때마다 step을 기준으로 counter를 증가시키고 For 문으로 돌아옵니다. 다시 counter와 end를 비교하여 결과에 따라 블록을 다시 실행하거나 루프를 종료합니다. counter가 end를 지나가거나 Exit For 문을 만날 때까지 이 프로세스는 계속됩니다.

루프는 counter가 end를 지나갈 때까지 종료되지 않습니다. counter가 end와 같으면 루프가 계속됩니다. 블록 실행 여부를 결정하는 비교 연산은 step이 양수일 경우 counter <= end이고 step이 음수일 경우 counter <= end입니다.

루프 안에 있는 동안 counter의 값을 변경하면 코드를 읽고 디버깅하기가 더욱 어려워질 수 있습니다. start, end 또는 step의 값을 변경하더라도 루프를 처음 입력했을 때 결정한 반복 값에는 영향을 주지 않습니다.

While...End While 문(Visual Basic)이나 Do...Loop 문(Visual Basic)은 루프에서 문을 몇 번 실행해야 하는지 미리 알지 못하는 경우 유용합니다. 그러나 루프 실행 횟수를 아는 경우에는 For...Next 루프가 더 유용합니다. 루프를 처음 입력할 때 반복 횟수를 결정합니다.

단계 인수

step의 값은 양수 또는 음수가 될 수 있습니다. 다음과 같이 루프 처리를 결정합니다.

Step 값

루프가 실행되는 경우

양수 또는 0

counter <= end

음수

counter >= end

지정되지 않은 경우step의 기본값은 1입니다.

카운터 인수

counter를 해당 루프의 외부에 선언하지 않은 경우에는 For 문에서 선언해야 합니다. 이 경우 counter의 범위는 루프 본문입니다. 그러나 루프 외부와 내부 모두에 counter를 선언할 수는 없습니다.

필요에 따라 Next 문에 counter를 지정할 수 있습니다. 이렇게 하면 특히 For 루프를 중첩한 경우 프로그램의 가독성이 향상됩니다. 해당 For 문에 나타나는 변수와 동일한 변수를 지정해야 합니다.

counter의 데이터 형식은 반복 형식을 결정하며 다음 중 한 가지이어야 합니다.

  • Byte, SByte, UShort, Short, UInteger, Integer, ULong, Long, Decimal, Single 또는 Double입니다.

  • Enum 문(Visual Basic) 문을 사용하여 선언하는 열거형입니다.

  • Object입니다.

  • 다음 연산자가 있는 형식 T이며, 여기서 B는 Boolean 식에 사용 가능한 형식입니다.

    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

start, end 및 step 식은 counter 형식으로 확대 변환되는 모든 데이터 형식으로 계산될 수 있습니다. counter에 대해 사용자 정의 형식을 사용하는 경우 CType 변환 연산자를 정의하여 start, end 또는 step의 형식을 counter의 형식으로 변환해야 함을 의미합니다.

루프 중첩

한 루프를 다른 루프 내에 배치하여 For 루프를 서로 중첩할 수 있습니다. 하지만 각 루프에는 고유한 counter 변수가 있어야 합니다.

또한 다른 종류의 제어 구조를 서로 중첩할 수 있습니다. 자세한 내용은 중첩 제어 구조(Visual Basic)을 참조하십시오.

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

Exit For

Exit 문(Visual Basic)은 For…Next 루프를 즉시 종료하고 제어를 Next 문 다음의 문으로 이동합니다.

For…Next 루프에 임의 수의 Exit For 문을 배치할 수 있습니다. 중첩된 For…Next 루프 내에 Exit For를 사용하면 Exit For는 가장 안쪽의 루프를 끝내고 중첩 수준이 그 다음으로 높은 루프에 제어를 전달합니다.

Exit For는 If...Then...Else 구조와 마찬가지로 주로 일부 조건을 계산한 후에 사용됩니다. 다음 조건에 대해 Exit For를 사용할 수 있습니다.

  • 계속 반복은 불필요하며 불가능합니다. 오류가 있는 값 또는 종료 요청이 원인일 수 있습니다.

  • Try...Catch...Finally에 예외가 catch되었습니다. Finally 블록 끝에 Exit For를 사용할 수 있습니다.

  • 매우 많이 또는 무한정 실행되는 루프인 무한 루프가 있습니다. 이러한 조건을 감지한 경우 Exit For를 사용하여 루프를 이스케이프할 수 있습니다. 자세한 내용은 Do...Loop 문(Visual Basic)을 참조하십시오.

Continue For 문은 제어를 루프의 다음 반복으로 바로 이동합니다. 자세한 내용은 Continue 문(Visual Basic)을 참조하십시오.

예제

다음 예제에서는 For…Next 문을 사용하는 방법을 보여 줍니다. 루프 counter 변수는 루프가 반복될 때마다 증가합니다. step 인수가 지정되지 않았으므로 기본값으로 1이 설정됩니다.

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

다음 예제에서는 counter 및 step 인수가 Double 부동 소수점 숫자입니다.

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 

다음 예제에서는 단계 값이 다른 중첩된 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

다음 예제에서는 제네릭 목록에서 모든 요소를 제거합니다. For Each...Next 문(Visual Basic) 대신, 반복되는 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

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

For index As Integer = 1 To 100000
    ' If index is between 5 and 7, continue
    ' with the next iteration.
    If index >= 5 And 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

다음 예제에서는 Enum 문(Visual Basic)문 사용하여 선언된 열거형을 통해 반복됩니다.

Public Enum Mammals
    Buffalo
    Gazelle
    Mongoose
    Rhinocerous
    Whale
End Enum


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

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

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

참고 항목

작업

방법: 루프 성능 개선(Visual Basic)

참조

While...End While 문(Visual Basic)

Do...Loop 문(Visual Basic)

Exit 문(Visual Basic)

For Each...Next 문(Visual Basic)

List<T>

개념

루프 구조(Visual Basic)

중첩 제어 구조(Visual Basic)

변경 기록

날짜

변경 내용

이유

2010년 12월

비고 섹션을 재구성하고 예제를 추가했습니다.

향상된 기능 관련 정보