[c#] C# 이터레이터와 제네릭

C#에서 이터레이터(iterator)와 제네릭(generic)은 데이터 구조를 효율적으로 처리할 수 있도록 도와주는 중요한 기능입니다. 이 두 가지 기능을 적절히 활용하면 코드의 가독성과 성능을 동시에 향상시킬 수 있습니다. 이번 포스트에서는 C#에서 이터레이터와 제네릭을 활용하여 어떻게 효율적인 데이터 처리를 할 수 있는지 살펴보겠습니다.

이터레이터(iterator)란?

이터레이터는 컬렉션 또는 데이터 시퀀스를 반복하는 데 사용되는 개념입니다. 이터레이터를 사용하면 컬렉션의 요소를 하나씩 순회하거나 필요에 따라 중간에 멈출 수 있습니다. C#에서는 yield 키워드를 사용하여 이터레이터를 정의할 수 있습니다.

public IEnumerable<int> GetNumbers()
{
    yield return 1;
    yield return 2;
    yield return 3;
}

위 예제에서 GetNumbers 메서드는 IEnumerable<int>를 반환하며, yield return을 통해 순차적으로 값을 반환합니다.

제네릭(generic)이란?

제네릭은 클래스, 구조체, 메서드, 인터페이스 등을 정의할 때 일반화된 데이터 타입을 사용할 수 있도록 해주는 기능입니다. 이를 통해 코드의 재사용성을 높일 수 있고, 타입 안정성을 보장할 수 있습니다.

public class Stack<T>
{
    private List<T> elements = new List<T>();

    public void Push(T item)
    {
        elements.Add(item);
    }

    public T Pop()
    {
        T item = elements.Last();
        elements.Remove(item);
        return item;
    }
}

위 예제에서 Stack 클래스는 제네릭으로 정의되어 있으며, T라는 일반화된 데이터 타입을 사용하여 요소를 추가하고 제거합니다.

이터레이터와 제네릭을 함께 활용하기

이터레이터와 제네릭을 함께 사용하면 다양한 데이터 구조를 효율적으로 처리할 수 있습니다. 예를 들어, 제네릭 스택을 순회하면서 값을 처리하고 싶을 때 이터레이터를 활용할 수 있습니다.

public IEnumerable<T> EnumerateItems()
{
    while (true)
    {
        yield return Pop();
    }
}

위 예제에서는 이터레이터를 사용하여 제네릭 스택에 저장된 값들을 순차적으로 반환합니다.

마무리

C#에서 이터레이터와 제네릭은 데이터 처리를 보다 효율적으로 만들어주는 강력한 기능입니다. 이 두 가지 기능을 적절히 활용하면 코드의 가독성과 성능을 향상시킬 수 있으며, 범용적인 데이터 구조를 설계하는 데 유용합니다.

다양한 데이터 구조를 다루는 C# 프로그래밍에서 이터레이터와 제네릭의 사용법을 숙지하고, 실제 프로젝트에 적용하여 효율적인 데이터 처리를 경험해보시기를 권장합니다.

참고 자료