C#에는 컬렉션을 순회(iteration)하기 위한 두 가지 핵심 인터페이스가 있습니다. 바로 IEnumerable과 IEnumerator입니다. 이름이 비슷해 헷갈리기 쉽지만, 두 인터페이스는 역할과 사용 목적이 뚜렷하게 다릅니다.
IEnumerable 인터페이스란?
IEnumerable은 단 하나의 메서드인 GetEnumerator()를 정의하는 인터페이스입니다. 이 메서드는 IEnumerator 객체를 반환하며, 컬렉션을 순회할 수 있는 '반복자(enumerator)'를 제공하는 역할을 합니다.
IEnumerable을 구현한 컬렉션은 읽기 전용 방식으로 접근할 수 있으며, foreach 문에서 직접 사용할 수 있다는 큰 장점이 있습니다. 실제로 C#에서 foreach로 순회 가능한 모든 컬렉션(List, Array 등)은 내부적으로 이 인터페이스를 구현하고 있습니다.
IEnumerator 인터페이스란?
IEnumerator는 실제로 컬렉션 내부를 한 요소씩 이동하며 순회를 수행하는 인터페이스입니다. 다음과 같은 멤버들을 포함합니다.
- MoveNext() – 다음 요소로 이동합니다. 이동에 성공하면
true, 컬렉션의 끝에 도달하면false를 반환합니다. - Reset() – 반복자를 컬렉션의 첫 번째 요소 앞 위치로 초기화합니다.
- Current – 현재 위치의 요소를 가져오는 속성(property)입니다.
즉, IEnumerable이 '순회할 수 있는 컬렉션'이라면, IEnumerator는 '실제로 순회를 수행하는 도구'라고 이해하면 됩니다.
구현 예제
다음 코드는 하나의 클래스에서 IEnumerable과 IEnumerator를 모두 구현한 예제입니다.
class Demo : IEnumerable, IEnumerator {
// IEnumerable 메서드 - GetEnumerator()
IEnumerator IEnumerable.GetEnumerator() {
throw new NotImplementedException();
}
// IEnumerator 속성 - Current
public object Current {
get { throw new NotImplementedException(); }
}
// IEnumerator 메서드 - MoveNext()
public bool MoveNext() {
throw new NotImplementedException();
}
// IEnumerator 메서드 - Reset()
public void Reset() {
throw new NotImplementedException();
}
}위 코드에서 볼 수 있듯이, IEnumerator는 MoveNext()와 Reset() 두 개의 메서드 그리고 Current 속성으로 구성됩니다.
// IEnumerator 메서드 - MoveNext()
public bool MoveNext() {
throw new NotImplementedException();
}
// IEnumerator 메서드 - Reset()
public void Reset() {
throw new NotImplementedException();
}정리
- IEnumerable:
GetEnumerator()메서드 하나만 정의하며,foreach문으로 순회 가능한 컬렉션임을 나타냅니다. - IEnumerator:
MoveNext(),Reset()메서드와Current속성을 통해 실제 순회 로직을 담당합니다. - 두 인터페이스는 함께 동작합니다.
IEnumerable.GetEnumerator()가 호출되면IEnumerator가 반환되어 컬렉션 순회가 시작됩니다.