yield 키워드란?
C#의 yield 키워드는 return문과 함께 사용되어 메서드가 반복자임을 설정합니다. 쉽게 설명하자면, 일반적으로 컬렉션 또는 배열을 반복문으로 접근하는 경우 다음 예제처럼 foreach문을 사용하는 경우가 일반적입니다.
class Program
{
static void Main(string[] args)
{
ArrayList arrList = new ArrayList() { 1, 2, 3 };
foreach (var item in arrList)
Console.WriteLine("item: {0}", item);
}
}
실행 결과
foreach문은 위 예제처럼 컬렉션 또는 배열처럼 반복 가능한 객체를 in 우측에 작성하는데, yield 키워드를 사용한 메서드도 in 우측에 작성할 수 있습니다.
이번 포스팅은 yield 키워드에 대해 설명합니다.
관련 포스팅
yield 키워드 정의
다음은 yield 키워드를 정의하는 방법입니다.
yield return <expression>;
yield break;
yield return <expression>;
문은 한 번에 하나의 요소를 반환하며 yield 키워드의 반환 타입은 IEnumerable 또는 IEnumerator 클래스 객체입니다.
yield break;
문은 반복문을 종료하는데 사용합니다.
yield 키워드 사용시 요구 사항
다음은 yield 키워드 사용 시 요구 사항입니다.
- ref 또는 out 키워드를 사용하지 않습니다.
- yield의 반환 타입은 IEnumerable 또는 IEnumerator 클래스 객체입니다.
yield return
문은 try 블록에서만 사용할 수 있습니다.yield break
문은 try 또는 catch 블록에서만 사용할 수 있으며 finally 블록에서는 사용할 수 없습니다.
yield 키워드 예제
다음은 yield 키워드를 사용한 간단한 코드로 1부터 5까지 합을 구하는 예제입니다.
class Program
{
static IEnumerable<int> Sum(int startValue, int endValue)
{
int result = startValue;
for (int loop = startValue; loop < endValue; loop++)
{
result = result + loop;
yield return result;
}
}
static void Main(string[] args)
{
foreach (int result in Sum(1, 5))
Console.WriteLine("result: {0}", item);
}
}
실행 결과
다음은 위 예제의 동작 과정입니다.
실행 순서
foreach (int result in Sum(1, 5))
의 첫 번째 루프에서Sum()
메서드를 호출하여 메서드를 실행합니다.Sum()
메서드의 변수result
는 매개변수startValue
의 값(1)으로 초기화됩니다.- 첫 번째 for 루프를 실행하고
result
는 2로 할당됩니다.yield return
문에 의해서 변수result
가 반환됩니다. - 콘솔에 2가 출력됩니다.
- 두 번째 루프를 실행하고
result
는 4로 할당됩니다.yield return
문에 의해서 변수result
가 반환됩니다. - 콘솔에 4가 출력됩니다.
- 세 번째 루프를 실행하고
result
는 7로 할당됩니다.yield return
문에 의해서 변수result
가 반환됩니다. - 콘솔에 7이 출력됩니다.
- 네 번째 루프를 실행하고
result
는 11로 할당됩니다.yield return
문에 의해서 변수result
가 반환됩니다. - 콘솔에 11이 출력됩니다.
Sum()
메서드에서 for문이 끝났기 때문에 마지막 블록을 실행 후Sum()
메서드가 종료됩니다.
위 설명이 어렵다면, 예제 코드를 복사하여 중단점을 걸어 디버깅하는 것을 권장드립니다. 여기서 중요한 내용은 Sum()
메서드가 yield return
문을 만나도 종료되지 않고 계속 실행 중이라는 점입니다.
yield 키워드의 장점은 사용자 정의 컬렉션 클래스를 구현할 때, IEnumerable 클래스와 IEnumerator 클래스를 구현하지 않아도 된다는 점입니다.
'C#' 카테고리의 다른 글
[C#]람다식, 람다표현식(Lambda expression) (0) | 2022.05.01 |
---|---|
[C#]SortedList 클래스 (0) | 2022.02.06 |
[C#]IEnumerable 인터페이스란? (0) | 2022.02.06 |
[C#]동적 변수(dynamic) (0) | 2022.02.05 |
[C#]익명 타입(Anonymous Type) (0) | 2022.02.05 |
댓글