컬렉션과 데이터 구조 – 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는 컬렉션과 데이터 구조를 다룰 때 매우 유용하며, 반복문을 사용하여 데이터를 처리하는 데 도움을 줍니다. 이 인터페이스들을 활용하여 데이터를 순차적으로 읽거나 선택적으로 반환할 수 있습니다. 또한, 코드의 가독성과 유지 보수성을 향상시킬 수 있습니다.
IEnumerable
과 IEnumerator
는 C# 컬렉션 프레임워크의 핵심 인터페이스로, 컬렉션을 반복하거나 열거하는 데 사용됩니다. 이들 인터페이스를 이해하고 사용하는 방법에 대해 설명하고 예제 코드를 제공하겠습니다.
IEnumerable
IEnumerable
인터페이스는 모든 컬렉션이 구현해야 하는 기본 인터페이스입니다.- 이 인터페이스는
GetEnumerator
메서드를 정의합니다. 이 메서드는IEnumerator
객체를 반환하며, 이 객체를 사용하여 컬렉션을 순회할 수 있습니다. foreach
루프는 내부적으로IEnumerable
과IEnumerator
를 사용하여 컬렉션을 반복합니다.
예제: 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);
}
}
}
이 코드는 MyCollection
의 IEnumerator<int>
를 직접 사용하여 컬렉션을 순회합니다. MoveNext
를 호출하여 다음 요소로 이동하고, Current
속성을 통해 현재 요소에 액세스합니다.
요약
IEnumerable
과IEnumerator
는 컬렉션을 순회하는 데 필요한 인터페이스입니다.IEnumerable
은IEnumerator
객체를 반환하는GetEnumerator
메서드를 정의합니다.IEnumerator
는 컬렉션을 하나씩 순회하면서 현재 요소에 액세스할 수 있도록 합니다.
마무리
컬렉션과 데이터 구조를 다룰 때는 IEnumerable과 IEnumerator 인터페이스를 활용하여 반복 작업을 수행할 수 있습니다. 이를 통해 컬렉션의 요소를 순차적으로 처리하거나 필요한 요소를 선택적으로 반환할 수 있습니다. IEnumerable과 IEnumerator는 프로그래밍에서 매우 중요한 개념이므로, 충분히 숙지하고 활용하는 것이 좋습니다.