yield키워드는 호출자(Caller)에게 컬렉션 데이터를 하나씩 리턴할 때 사용한다
Enumerator(Iterator)와 같은 개념이며 집합적인 데이터셋으로부터 데이터를 하나씩 호출자에게 보내준다
using System;
using System.Collections.Generic;
class Program
{
static IEnumerable<int> GetNumber()
{
yield return 10; // 첫번째 루프에서 리턴되는 값
yield return 20; // 두번째 루프에서 리턴되는 값
yield return 30; // 세번째 루프에서 리턴되는 값
}
static void Main(string[] args)
{
foreach (int num in GetNumber())
{
Console.WriteLine(num);
}
}
}
C#에서 Iterator 방식으로 yield 를 사용하면, 명시적으로 별도의 Enumerator 클래스를 작성할 필요가 없다
Enumerator는 데이타 요소를 하나씩 리턴하는 기능을 하는 것으로 C#/.NET에서 Enumerator는 IEnumerator 라는 인터페이스를 구현해야 한다
IEnumerator 인터페이스는 Current (속성), MoveNext() (메서드), Reset() (메서드) 등 3개의 멤버를 가지고 있으며 이중 Current, MoveNext()는 필수 구현 요소이다
using System;
using System.Collections;
namespace ex_csharp
{
class Program
{
static void Main(string[] args)
{
// 1. foreach 사용하여 Iteration
var list = new MyList();
foreach (var item in list)
{
Console.WriteLine(item);
}
// 2. 수동 Iteration
IEnumerator it = list.GetEnumerator();
it.MoveNext();
Console.WriteLine(it.Current); // 1
it.MoveNext();
Console.WriteLine(it.Current); // 2
}
}
class MyList
{
private int[] data = { 1, 2, 3, 4, 5 };
public IEnumerator GetEnumerator()
{
int i = 0;
while (i < data.Length)
{
yield return data[i];
i++;
}
}
}
}