Visual Basic에는 For 루프와 For Each 루프가 있으며, 각각 특정 작업에 적합합니다.
VB6 및 클래식 Visual Basic은 범위 기반 루프(For ... Next)만 지원했습니다. 이후의 버전(VB6 및 VB.NET부터)은 컬렉션과 배열의 요소를 우아하게 반복할 수 있게 해주는 For Each가 추가되었습니다.
주요 문제는 루프 유형을 잘못 선택하거나 For Each 내에서 컬렉션을 수정하려고 시도하는 것으로, 이는 실행 오류로 이어집니다.
다음과 같은 경우에는 일반 For를 사용하세요:
For Each를 사용할 경우:
코드 예:
' 변경 가능한 요소 반복 Dim arr() As Integer = {1, 2, 3} For i As Integer = 0 To arr.Length - 1 arr(i) = arr(i) * 2 Next ' 컬렉션 읽기 전용 Dim list As New List(Of String) From {"one", "two", "three"} For Each s As String In list Console.WriteLine(s) Next
주요 특징:
For Each 내에서 List(Of T) 컬렉션을 수정할 수 있나요?
불가능합니다. 이는 InvalidOperationException을 초래합니다. 컬렉션 구조는 반복 중에 변경될 수 없습니다.
For Each에서 일찍 종료하려면 어떻게 해야 하나요?
필요한 요소를 찾았을 때 Exit For 문을 사용하세요.
For Each s In list If s = "two" Then Exit For End If Next
배열에서 For와 For Each의 속도 차이는 무엇인가요?
보통 차이는 미미하지만, For가 약간 더 빠를 수 있습니다(특히 원시 타입 배열의 경우) 왜냐하면 인덱스를 직접 다루기 때문이고, For Each는 추가적인 enumerator 객체를 생성합니다.
** 부정적인 사례
개발자가 For Each 내에서 List(Of T)에서 요소를 삭제하려고 시도하며 실행 중 InvalidOperationException 오류가 발생합니다.
장점:
단점:
** 긍정적인 사례
요소 삭제를 위해 일반 For를 사용하여 끝에서부터 반복합니다:
For i = list.Count - 1 To 0 Step -1 If list(i) = "two" Then list.RemoveAt(i) End If Next
장점:
단점: