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
인터페이스는 컬렉션의 요소를 반복하는 데 사용됩니다. 이 인터페이스는 MoveNext
와 Current
메서드를 포함하며, 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
인터페이스를 이용하면 간편하게 반복기를 만들고 사용할 수 있으며, 코드를 더 유연하고 가독성있게 작성할 수 있습니다.