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 |
선택 사항. 지정된 횟수만큼 실행되는 For 과 Next 사이에 있는 하나 이상의 문입니다. |
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에 도달한 후에 끝납니다. -.25
의 Step
인수는 루프가 반복될 때마다 값을 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
문은 For
…Next
루프를 즉시 종료하고 Next
문 뒤에 오는 문으로 제어를 전달합니다.
Continue For
문은 루프의 다음 반복으로 즉시 제어를 전달합니다. 자세한 내용은 Continue 문을 참조하세요.
다음 예에서는 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 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
문을 For
…Next
루프에 넣을 수 있습니다. 중첩된 For
…Next
루프 내에서 사용되는 경우 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은 이때만 이러한 값을 평가한 다음 start
를 counter
에 할당합니다. 문 블록이 실행되기 전에 Visual Basic은 counter
를 end
와 비교합니다. counter
가 이미 end
값보다 큰 경우(step
이 음수일 때는 더 작은 경우) For
루프가 종료되고 제어는 Next
문 다음에 오는 문으로 전달됩니다. 그렇지 않으면 명령문 블록이 실행됩니다.
Visual Basic은 Next
문이 있을 때마다 counter
를 step
만큼 증가시키고 For
문으로 돌아갑니다. 다시 한 번 counter
를 end
와 비교하고 결과에 따라 다시 블록을 실행하거나 루프를 종료합니다. 이 프로세스는 counter
가 end
를 통과하거나 Exit For
문을 만날 때까지 계속됩니다.
루프는 counter
가 end
를 통과할 때까지 멈추지 않습니다. counter
가 end
와 같으면 루프가 계속됩니다. 블록 실행 여부를 결정하는 비교는 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
형식(여기서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
필요에 따라 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
참고 항목
.NET