Share via


컬렉션 열거

.NET Framework는 컬렉션 사이의 이동을 위한 가장 쉬운 방법으로 열거자를 제공합니다. 열거자는 컬렉션에서 데이터를 읽기만 할 뿐 기본 컬렉션을 수정하는데 사용하지는 못합니다.

일부 언어에서는 열거자를 직접 사용하는 복잡성을 숨기는 명령문을 제공합니다. C# foreach 문, C++ for each 문 및 Visual Basic For Each 문은 열거자를 사용합니다.

열거자에 대한 정보

열거자는 컬렉션을 재배열하여 멤버를 순차적으로 액세스할 수 있도록 합니다. 컬렉션 클래스에 따라 서로 다른 시퀀스를 가질 수 있습니다. 예를 들어, ArrayList에 대한 열거자는 요소가 컬렉션에 입력된 순서를 유지하는 반면, Hashtable에 대한 열거자는 요소의 해시 코드에 따라 요소를 표시합니다.

모든 열거자는 IEnumerator 인터페이스 또는 IEnumerator<T> 제네릭 인터페이스를 기반으로 하며 다음과 같은 멤버를 필요로 합니다.

  • Current 속성은 컬렉션의 현재 멤버를 가리킵니다.

  • MoveNext 속성은 열거자를 컬렉션의 다음 멤버로 이동합니다.

  • Reset 속성은 열거자를 다시 컬렉션의 처음으로 이동시킵니다. Current는 첫 번째 요소 앞에 위치합니다. 제네릭 IEnumerator<T> 인터페이스에서는 Reset을 사용할 수 없습니다.

열거자의 동작 방식

초기에 열거자는 컬렉션의 첫 번째 요소 앞에 위치합니다. Reset도 열거자를 다시 이 위치로 놓습니다. 이 위치에서는 Current가 정의되지 않습니다. 따라서 Current의 값을 읽기 전에 MoveNext를 호출하여 열거자를 컬렉션의 첫 번째 요소로 보내야 합니다.

CurrentMoveNext 또는 Reset이 호출될 때까지 같은 개체를 반환합니다. MoveNextCurrent를 다음 요소로 설정합니다.

MoveNext가 컬렉션의 끝을 지나면 열거자가 컬렉션의 마지막 요소 뒤에 배치되며 MoveNext는 false를 반환합니다. 열거자가 이 위치에 있으면 MoveNext에 대한 후속 호출에서도 false를 반환합니다. MoveNext에 대한 마지막 호출에서 false를 반환한 경우, Current가 정의되지 않습니다.

제네릭이 아닌 컬렉션에서는 Reset 다음에 MoveNext를 호출하여 열거자를 컬렉션의 시작 부분으로 다시 이동할 수 있습니다.

제네릭 컬렉션에서는 Current를 다시 컬렉션의 첫 번째 요소로 설정할 수 없으므로, 대신 새 열거자 인스턴스를 만들어야 합니다.

열거자는 컬렉션이 변경되지 않은 상태로 유지되는 한 유효합니다. 요소를 추가, 수정 또는 삭제하는 등 컬렉션을 변경하면 열거자가 더 이상 유효하지 않게 되며(복구할 수 없음) 해당 동작은 정의되지 않은 상태가 됩니다.

열거자는 컬렉션에 독점적으로 액세스할 수 있는 권한이 없으므로 컬렉션을 열거하는 프로시저는 기본적으로 스레드로부터 안전하지 않습니다. 열거하는 동안 스레드로부터 안전하게 보호하려면 열거하는 동안 컬렉션을 잠글 수 있습니다. 여러 스레드에서 컬렉션에 액세스하여 읽기 및 쓰기를 수행하도록 허용하려면 동기화를 직접 구현하거나 System.Collections.Concurrent 네임스페이스의 스레드로부터 안전한 컬렉션 클래스 중 하나를 사용해야 합니다. System.Collections.Concurrent.ConcurrentQueue<T>System.Collections.Concurrent.ConcurrentStack<T> 클래스는 요소를 열거하기 전에 요소의 스냅숏을 만들어 다른 스레드에서 컬렉션을 변경하지 못하게 합니다. System.Collections.Concurrent.ConcurrentDictionary<TKey, TValue> 클래스는 스냅숏을 만들지 않습니다.

System.Collections.Concurrent.BlockingCollection<T> 클래스는 GetConsumingEnumerable이라는 열거자 메서드를 제공하고, 이 메서드는 컬렉션의 항목을 열거할 때 컬렉션에서 항목을 제거하여 컬렉션을 변경합니다.

참고 항목

참조

IEnumerator

IEnumerator<T>

IDictionaryEnumerator

IEnumerable

IEnumerable<T>

기타 리소스

컬렉션 만들기 및 조작

스레드로부터 안전한 컬렉션