질문 배경
For...Next 루프는 Visual Basic의 초기 버전부터 존재하며, 값의 범위를 반복할 수 있게 해줍니다. 배열과 컬렉션 작업에 자주 사용됩니다. VB.NET에서는 보다 엄격한 의미의 카운터와 스텝(step) 지원이 추가되었습니다.
문제
전형적인 실수는 루프 카운터(예: i)의 값을 변경하는 것으로, 이는 잘못된 동작을 초래합니다. 루프마다 카운터는 자동으로 증감되기 때문입니다. 또한 컬렉션의 반복 경계를 올바르게 설정하는 것이 중요합니다(예: For i = 0 To arr.Length - 1).
해결책
항상 불변 카운터를 사용하거나 루프 본문 내에서 컬렉션이 변경될 수 있는 경우 상한 경계를 위한 표현식을 변수에 바로 저장하세요. 루프 본문에서 카운터 변수를 명시적으로 변경하지 마십시오.
코드 예:
Dim arr() As Integer = {1, 2, 3, 4} For i As Integer = 0 To arr.Length - 1 Console.WriteLine(arr(i)) Next
주요 특징:
루프 본문에서 카운터를 수동으로 변경하면 어떻게 됩니까?
현재 반복 내에서는 실제로 값이 변경되지만, 반복이 끝날 때 Visual Basic은 자동으로 증감/감소를 수행하므로 예측할 수 없는 반복 수를 초래합니다.
For i = 1 To 5 If i = 3 Then i = 1 Console.WriteLine(i) Next
For...Next를 List(Of T)와 같은 컬렉션 반복에 사용할 수 있습니까?
예, 가능하지만 컬렉션의 변경 가능한 크기로 인한 오류를 피하기 위해 For Each를 사용하는 것이 바람직합니다. For...Next는 인덱스만을 저장합니다.
양수 단계에서 상한이 하한보다 낮으면 어떻게 됩니까?
루프는 단 한 번도 실행되지 않습니다.
For i = 5 To 1 ' Step이 없으면 루프는 실행되지 않음 ... Next
특정 요소를 발견했을 때 카운터가 수동으로 변경되어 이후의 요소를 건너뛰려 시도한 결과 일부 반복이 생략되고 무한 루프가 발생했습니다.
장점:
단점:
조건 제어를 위한 별도의 변수를 사용하고, 루프 카운터에 간섭하지 않았습니다.
장점:
단점: