프로그래밍VB.NET 개발자, 백엔드 개발자

Visual Basic에서 For Each 루프는 어떻게 작동합니까? For 및 While과의 차이점은 무엇이며, 어떤 객체를 이 방법으로 반복할 수 있으며, 루프 중에 컬렉션을 변경할 때 발생하는 함정은 무엇입니까?

Hintsage AI 어시스턴트로 면접 통과

답변

Visual Basic의 For Each 루프는 컬렉션 또는 배열의 모든 요소를 순차적으로 반복하는 데 사용됩니다. 명시적으로 인덱스에 접근할 필요 없이 열거 가능한 객체(Collection, Array, 목록 등)를 다루는 것을 간소화합니다.

구문:

For Each element As DataType In collection ' element에 대한 작업 Next

다른 루프와의 차이점:

  • For — 카운터와 범위를 지정해야 하며, 인덱스로 요소에 접근해야 할 때 효과적입니다.
  • While — 조건이 참인 동안 실행되며, 예측할 수 없는 반복 횟수에 유용합니다.
  • For Each — 인덱스에 접근하지 않고 모든 요소를 반복하므로 현대 컬렉션에 적합합니다.

For Each의 제한 사항 및 특징:

  • 직접적으로 컬렉션의 요소를 변경할 수 없습니다 (특히 컬렉션이 변경 불가능하거나 구조적일 경우).
  • 컬렉션은 IEnumerable 인터페이스를 구현해야 합니다.
  • 루프 중에 컬렉션을 변경(요소 추가/삭제)하면 InvalidOperationException 예외가 발생할 수 있습니다.

예제:

Dim items As New List(Of Integer)({1, 2, 3}) For Each item As Integer In items Console.WriteLine(item) Next

루프 내에서 컬렉션을 변경하려고 하면 오류가 발생할 수 있습니다:

For Each item As Integer In items If item = 2 Then items.Remove(item) ' 예외! End If Next

함정이 있는 질문

구조체가 요소인 경우 For Each를 사용하여 값으로 컬렉션의 요소를 변경할 수 있습니까?

아니요. 컬렉션의 요소가 구조체(값형)인 경우 For Each의 반복 변수는 값의 복사본을 포함합니다. 변수를 변경해도 컬렉션의 실제 요소는 영향을 받지 않습니다. 예:

Structure Point Public X As Integer End Structure Dim points As New List(Of Point)({New Point With {.X = 1}}) For Each pt In points pt.X = 100 ' points(0).X를 변경하지 않음 Next

이 주제의 미숙지로 인한 실제 오류 사례


이야기

프로젝트에서 직원의 구조체 필드를 변경하기 위해 For Each를 사용했습니다. 반복 결과가 원본 데이터를 변경하지 않았습니다. 반복 객체는 복사본이었고 컬렉션의 요소가 아니었습니다. 이로 인해 급여 업데이트가 작동하지 않았습니다.


이야기

For Each로 목록을 반복하는 동안 조건에서 요소를 삭제했습니다. 그 결과 애플리케이션이 InvalidOperationException을 발생시키고 강제 종료되었습니다.


이야기

For Each를 통해 컬렉션을 반복하는 동안 가변성을 고려하지 않아 외부 데이터 소스가 컬렉션을 읽는 동안 동시에 충족되어 논리적 오류가 발생하는 무한 루프가 발생했습니다.