[21장] 컬렉션과 데이터 구조 – IEnumerable과 IEnumerator

image
출처: Alexis Caso

컬렉션과 데이터 구조 – IEnumerable과 IEnumerator

컬렉션을 반복하는 인터페이스

컬렉션과 데이터 구조를 다루는 데 사용되는 인터페이스 중에서 가장 기본적인 것이 바로 IEnumerable과 IEnumerator입니다. 이 두 인터페이스는 컬렉션의 요소를 반복하고 처리하는 데 도움을 주는 역할을 합니다. IEnumerable은 컬렉션을 반복할 수 있는 기본 인터페이스이며, IEnumerator는 현재 항목을 반환하고 다음 항목으로 이동하는 메서드를 제공합니다.

IEnumerable과 IEnumerator의 역할

IEnumerable은 컬렉션을 반복하기 위해 GetEnumerator() 메서드를 구현해야 합니다. 이 메서드는 IEnumerator 객체를 반환하며, IEnumerator는 MoveNext()와 Current() 메서드를 구현해야 합니다. MoveNext()는 다음 요소로 이동하고, 더 이상 요소가 없으면 false를 반환합니다. Current()는 현재 요소를 반환합니다. 이러한 인터페이스들을 구현함으로써 foreach 문을 사용하여 컬렉션을 간편하게 반복할 수 있습니다.

IEnumerable과 IEnumerator의 활용

.NET에서는 IEnumerable을 구현하는 모든 객체를 반복할 수 있습니다. 컬렉션이 IEnumerable을 구현하지 않는 경우에도 GetEnumerator() 메서드를 제공하여 foreach 문을 지원해야 합니다. C#에서는 IEnumerator를 구현해야 하고, Visual Basic에서는 IEnumerator를 반환하는 GetEnumerator() 메서드를 제공해야 합니다. 이러한 인터페이스들을 구현하여 컬렉션을 간편하게 반복할 수 있습니다.

IEnumerable과 IEnumerator의 활용 예시

IEnumerable과 IEnumerator는 컬렉션과 데이터 구조를 다룰 때 매우 유용하며, 반복문을 사용하여 데이터를 처리하는 데 도움을 줍니다. 이 인터페이스들을 활용하여 데이터를 순차적으로 읽거나 선택적으로 반환할 수 있습니다. 또한, 코드의 가독성과 유지 보수성을 향상시킬 수 있습니다.

IEnumerableIEnumerator는 C# 컬렉션 프레임워크의 핵심 인터페이스로, 컬렉션을 반복하거나 열거하는 데 사용됩니다. 이들 인터페이스를 이해하고 사용하는 방법에 대해 설명하고 예제 코드를 제공하겠습니다.

IEnumerable

  • IEnumerable 인터페이스는 모든 컬렉션이 구현해야 하는 기본 인터페이스입니다.
  • 이 인터페이스는 GetEnumerator 메서드를 정의합니다. 이 메서드는 IEnumerator 객체를 반환하며, 이 객체를 사용하여 컬렉션을 순회할 수 있습니다.
  • foreach 루프는 내부적으로 IEnumerableIEnumerator를 사용하여 컬렉션을 반복합니다.

예제: IEnumerable 구현

아래 예제에서는 IEnumerable을 구현하는 간단한 컬렉션 클래스를 만들어 보겠습니다.

public class MyCollection : IEnumerable<int>
{
    private int[] items = { 1, 2, 3, 4, 5 };

    public IEnumerator<int> GetEnumerator()
    {
        return new MyEnumerator(items);
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        return GetEnumerator();
    }
}

public class MyEnumerator : IEnumerator<int>
{
    private readonly int[] _items;
    private int _position = -1;

    public MyEnumerator(int[] items)
    {
        _items = items;
    }

    public bool MoveNext()
    {
        _position++;
        return _position < _items.Length;
    }

    public void Reset()
    {
        _position = -1;
    }

    public int Current => _items[_position];

    object IEnumerator.Current => Current;

    public void Dispose()
    {
        // Dispose resources if needed.
    }
}

class Program
{
    static void Main(string[] args)
    {
        MyCollection collection = new MyCollection();

        foreach (int item in collection)
        {
            Console.WriteLine(item);
        }
    }
}

이 예제에서 MyCollection 클래스는 IEnumerable<int> 인터페이스를 구현하고, MyEnumerator 클래스는 IEnumerator<int> 인터페이스를 구현합니다. 이 구조를 통해 foreach 루프를 사용하여 MyCollection의 각 요소에 액세스할 수 있습니다.

IEnumerator

  • IEnumerator 인터페이스는 컬렉션의 요소를 순회하기 위한 메서드와 속성을 제공합니다.
  • MoveNext 메서드는 컬렉션의 다음 요소로 이동하고, 더 이상 요소가 없으면 false를 반환합니다.
  • Current 속성은 컬렉션의 현재 요소를 반환합니다.
  • Reset 메서드는 열거자를 초기 위치로 되돌립니다.

예제: IEnumerator 사용

아래 예제에서는 IEnumerator를 직접 사용하여 컬렉션을 순회하는 방법을 보여줍니다.

class Program
{
    static void Main(string[] args)
    {
        MyCollection collection = new MyCollection();
        IEnumerator<int> enumerator = collection.GetEnumerator();

        while (enumerator.MoveNext())
        {
            Console.WriteLine(enumerator.Current);
        }
    }
}

이 코드는 MyCollectionIEnumerator<int>를 직접 사용하여 컬렉션을 순회합니다. MoveNext를 호출하여 다음 요소로 이동하고, Current 속성을 통해 현재 요소에 액세스합니다.

요약

  • IEnumerableIEnumerator는 컬렉션을 순회하는 데 필요한 인터페이스입니다.
  • IEnumerableIEnumerator 객체를 반환하는 GetEnumerator 메서드를 정의합니다.
  • IEnumerator는 컬렉션을 하나씩 순회하면서 현재 요소에 액세스할 수 있도록 합니다.

마무리

컬렉션과 데이터 구조를 다룰 때는 IEnumerable과 IEnumerator 인터페이스를 활용하여 반복 작업을 수행할 수 있습니다. 이를 통해 컬렉션의 요소를 순차적으로 처리하거나 필요한 요소를 선택적으로 반환할 수 있습니다. IEnumerable과 IEnumerator는 프로그래밍에서 매우 중요한 개념이므로, 충분히 숙지하고 활용하는 것이 좋습니다.

다른 글 보기