C#

[C#]yield 키워드

DevStory 2022. 2. 6.

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 키워드에 대해 설명합니다.

 

관련 포스팅

☞ [C#]IEnumerable 인터페이스란?

 


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);

    }
}

실행 결과

다음은 위 예제의 동작 과정입니다.

실행 순서

  1. foreach (int result in Sum(1, 5))의 첫 번째 루프에서 Sum() 메서드를 호출하여 메서드를 실행합니다.
  2. Sum() 메서드의 변수 result는 매개변수 startValue의 값(1)으로 초기화됩니다.
  3. 첫 번째 for 루프를 실행하고 result는 2로 할당됩니다. yield return문에 의해서 변수 result가 반환됩니다.
  4. 콘솔에 2가 출력됩니다.
  5. 두 번째 루프를 실행하고 result는 4로 할당됩니다. yield return문에 의해서 변수 result가 반환됩니다.
  6. 콘솔에 4가 출력됩니다.
  7. 세 번째 루프를 실행하고 result는 7로 할당됩니다. yield return문에 의해서 변수 result가 반환됩니다.
  8. 콘솔에 7이 출력됩니다.
  9. 네 번째 루프를 실행하고 result는 11로 할당됩니다. yield return문에 의해서 변수 result가 반환됩니다.
  10. 콘솔에 11이 출력됩니다.
  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

댓글