[c#] C# yield 구문과 반복기IEnumerator

C#에서 yield 키워드는 특별한 반복기(iterator)를 만들 때 사용됩니다. 이 기능을 사용하면 메서드가 호출자에게 루프에서 반환할 값의 시퀀스를 생성하는 데 사용될 수 있습니다. 제네릭 또는 컬렉션을 쉽게 반복할 수 있도록 해주는 반복기(IEnumerator)를 만들 수 있습니다.

yield return 문

yield return 문은 현재 메서드를 일시 중지하고 반환값을 제공한 다음, 다음 호출자로 이동하는 데 사용됩니다. 이 때, 현재 상태를 기억하여 다음 호출 때 비동기적으로 반복할 수 있도록 합니다. 반환된 값의 형식은 현재 메서드 정의의 반환 형식과 일치해야 합니다.

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

위의 코드에서 GetNumbers 메서드는 IEnumerable<int> 값을 반환합니다. yield return 문은 1, 2, 3을 반환하고 각각의 호출자에게 반환하여 값을 생성합니다.

yield break 문

yield break 문은 반복기를 강제로 종료시키는 데 사용됩니다. 이를 통해 반복기가 더 이상 값을 생성하지 않도록 하고 메서드를 완전히 종료할 수 있습니다.

public IEnumerable<int> GetNumbers(int count)
{
    for(int i = 0; i < count; i++)
    {
        if(i == 3)
        {
            yield break;
        }
        yield return i;
    }
}

위의 코드에서는 GetNumbers 메서드가 count 값까지의 숫자 시퀀스를 반복하고, 3에 도달하면 yield break 문을 통해 강제로 반복기를 종료합니다.

IEnumerator 인터페이스

C#의 IEnumerator 인터페이스는 컬렉션의 요소를 반복하는 데 사용됩니다. 이 인터페이스는 MoveNextCurrent 메서드를 포함하며, Current 메서드는 컬렉션에서 현재 위치의 요소를 반환합니다.

public class MyCollection : IEnumerable
{
    public IEnumerator GetEnumerator()
    {
        for(int i = 0; i < 5; i++)
        {
            yield return i;
        }
    }
}

위의 코드에서 MyCollection 클래스는 IEnumerable 인터페이스의 GetEnumerator 메서드를 구현하여, 새로운 IEnumerator 인스턴스를 반환합니다. 이를 통해 foreach 문 등을 통해 컬렉션을 순회할 수 있습니다.

이러한 C#의 yield 구문과 IEnumerator 인터페이스를 이용하면 간편하게 반복기를 만들고 사용할 수 있으며, 코드를 더 유연하고 가독성있게 작성할 수 있습니다.

참고 자료