C#에서 ArrayList의 전체 요소를 순회하려면 GetEnumerator() 메서드를 사용하여 열거자(Enumerator)를 얻을 수 있습니다. 이 메서드는 IEnumerator 인터페이스 객체를 반환하며, 이를 통해 컬렉션의 모든 요소에 순차적으로 접근할 수 있습니다.
열거자의 기본 동작 원리
IEnumerator 인터페이스는 다음 두 멤버를 중심으로 동작합니다.
- MoveNext(): 커서를 다음 요소로 이동시킵니다. 다음 요소가 존재하면 true, 더 이상 없으면 false를 반환합니다.
- Current: 현재 커서가 가리키는 요소를 반환합니다.
참고로 열거자는 읽기 전용이며 앞으로만 이동할 수 있습니다. 또한 열거 도중 컬렉션이 수정되면 InvalidOperationException이 발생할 수 있으므로 주의해야 합니다.
예제 1: 문자열 ArrayList 순회하기
using System;
using System.Collections;
public class Demo {
public static void Main(String[] args) {
ArrayList list1 = new ArrayList();
list1.Add("A");
list1.Add("B");
list1.Add("C");
list1.Add("D");
list1.Add("E");
list1.Add("F");
list1.Add("G");
list1.Add("H");
list1.Add("I");
Console.WriteLine("ArrayList1의 요소...");
foreach (string res in list1) {
Console.WriteLine(res);
}
ArrayList list2 = new ArrayList();
list2.Add("A");
list2.Add("B");
list2.Add("C");
list2.Add("D");
list2.Add("E");
list2.Add("F");
list2.Add("G");
list2.Add("H");
list2.Add("I");
Console.WriteLine("ArrayList2의 요소...");
foreach (string res in list2) {
Console.WriteLine(res);
}
Console.WriteLine("ArrayList2의 요소 개수 = " + list2.Count);
list2.RemoveAt(5);
Console.WriteLine("ArrayList2의 요소 개수 (삭제 후) = " + list2.Count);
Console.WriteLine("열거자로 ArrayList2 순회하기...");
IEnumerator demoEnum = list2.GetEnumerator();
while (demoEnum.MoveNext()) {
Console.WriteLine(demoEnum.Current);
}
}
}출력 결과
위 코드를 실행하면 다음과 같은 결과가 출력됩니다.
ArrayList1의 요소... A B C D E F G H I ArrayList2의 요소... A B C D E F G H I ArrayList2의 요소 개수 = 9 ArrayList2의 요소 개수 (삭제 후) = 8 열거자로 ArrayList2 순회하기... A B C D E G H I
위 예제에서 RemoveAt(5)를 호출하여 인덱스 5에 있는 요소 "F"가 삭제된 것을 확인할 수 있습니다. 따라서 열거자가 출력하는 목록에는 "F"가 포함되지 않습니다.
예제 2: 정수 ArrayList 순회하기
이번에는 정수형 데이터를 담은 ArrayList를 열거자로 순회해 보겠습니다.
using System;
using System.Collections;
public class Demo {
public static void Main() {
ArrayList arrList = new ArrayList();
arrList.Add(100);
arrList.Add(200);
arrList.Add(300);
arrList.Add(400);
arrList.Add(500);
Console.WriteLine("열거자로 ArrayList 순회하기...");
IEnumerator demoEnum = arrList.GetEnumerator();
while (demoEnum.MoveNext()) {
Console.WriteLine(demoEnum.Current);
}
}
}출력 결과
실행 결과는 다음과 같습니다.
열거자로 ArrayList 순회하기... 100 200 300 400 500
정리
ArrayList의 전체 열거자를 얻으려면 GetEnumerator() 메서드를 호출하고, 반환된 IEnumerator 객체의 MoveNext()와 Current를 조합하여 while 루프로 요소를 하나씩 처리하면 됩니다. 이 방식은 foreach 문과 유사한 결과를 제공하지만, 열거 과정을 직접 제어해야 하는 상황에서 유용하게 활용할 수 있습니다.