Computer >> 컴퓨터 >  >> 프로그래밍 >> C#

C# IEnumerator와 IEnumerable 인터페이스 차이점 총정리

C#에는 컬렉션을 순회(iteration)하기 위한 두 가지 핵심 인터페이스가 있습니다. 바로 IEnumerableIEnumerator입니다. 이름이 비슷해 헷갈리기 쉽지만, 두 인터페이스는 역할과 사용 목적이 뚜렷하게 다릅니다.

IEnumerable 인터페이스란?

IEnumerable은 단 하나의 메서드인 GetEnumerator()를 정의하는 인터페이스입니다. 이 메서드는 IEnumerator 객체를 반환하며, 컬렉션을 순회할 수 있는 '반복자(enumerator)'를 제공하는 역할을 합니다.

IEnumerable을 구현한 컬렉션은 읽기 전용 방식으로 접근할 수 있으며, foreach 문에서 직접 사용할 수 있다는 큰 장점이 있습니다. 실제로 C#에서 foreach로 순회 가능한 모든 컬렉션(List, Array 등)은 내부적으로 이 인터페이스를 구현하고 있습니다.

IEnumerator 인터페이스란?

IEnumerator는 실제로 컬렉션 내부를 한 요소씩 이동하며 순회를 수행하는 인터페이스입니다. 다음과 같은 멤버들을 포함합니다.

  • MoveNext() – 다음 요소로 이동합니다. 이동에 성공하면 true, 컬렉션의 끝에 도달하면 false를 반환합니다.
  • Reset() – 반복자를 컬렉션의 첫 번째 요소 앞 위치로 초기화합니다.
  • Current – 현재 위치의 요소를 가져오는 속성(property)입니다.

즉, IEnumerable이 '순회할 수 있는 컬렉션'이라면, IEnumerator는 '실제로 순회를 수행하는 도구'라고 이해하면 됩니다.

구현 예제

다음 코드는 하나의 클래스에서 IEnumerableIEnumerator를 모두 구현한 예제입니다.

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();
    }
}

위 코드에서 볼 수 있듯이, IEnumeratorMoveNext()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가 반환되어 컬렉션 순회가 시작됩니다.