Language/C#

[C#] yield 키워드

달별선장 2023. 9. 3. 08:22
728x90

yield 키워드는 IEnumerable<T> 화 함께 쓰인다. yield 키워드로 리턴되는 값들을 선언하면, 위에서부터 순차대로 값을 리턴한다. 만일 yield 키워드로 리턴하는 함수가 한 번 호출되면 첫번째 리턴값을 리턴한다.

 

다을 foreach 문에서 해당 함수를 순차대로 호출해 보았다. 

class Program
{
    static void Main(string[] args)
    {
        foreach (int num in getNumber())
        {
            Console.WriteLine(num);
        }
    }

    static IEnumerable<int> getNumber()
    {
        yield return 10;
        yield return 20;
        yield return 30;
    }
}

결과는 다음과 같다.

10
20
30

yield break; 문은 yield return 을 종료하고 루프 문을 빠져나올 때 사용된다.

 

 

class Program
{
    static void Main(string[] args)
    {
        foreach (int num in getNumber())
        {
            Console.WriteLine(num);
        }
    }

    static IEnumerable<int> getNumber()
    {
        yield return 10;
        yield return 20;
        yield break;
    }
}

출력 결과 :

10
20

 

IEnumerator 와 함께 사용하는 예시

using System;
using System.Collections;

namespace HelloWorld
{
    class Program
    {
        static void Main(string[] args)
        {
            // [1]
            // 반복문을 사용하여 호출하여 Iteration 호출 수만큼
            // 리턴 값 위치를 1씩 이동시키며 출력
            EnumeratorTest iterationTest1 = new EnumeratorTest();
            foreach (int item in iterationTest1)
            {
                Console.WriteLine(item);
            }

            // [2]
            // 반복문을 사용하지 않고 수동으로 1씩 호출하여 출력
            EnumeratorTest iterationTest2 = new EnumeratorTest();
            IEnumerator ienumerator = iterationTest2.GetEnumerator(); // 직접 호출
            ienumerator.MoveNext();
            Console.WriteLine(ienumerator.Current);
            ienumerator.MoveNext();
            Console.WriteLine(ienumerator.Current);
            ienumerator.MoveNext();
            Console.WriteLine(ienumerator.Current);
            ienumerator.MoveNext();
            Console.WriteLine(ienumerator.Current);
            ienumerator.MoveNext();
            Console.WriteLine(ienumerator.Current);
        }
    }

    class EnumeratorTest
    {
        // foreach 문을 사용하여 컬렉션을 반복하려면,
        // GetEnumerator() 메서드를 포함해야 한다.
        public IEnumerator GetEnumerator() 
        {
            int[] num = { 1, 2, 3, 4, 5 };

            for (int i = 0; i < num.Length; i++)
            {
                yield return num[i];
            }
        }
    }
}

출력 결과 :

1
2
3
4
5
1
2
3
4
5

 

IEnumerator 사용 시, GetEnumerator 메서드를 포함하지 않으면  CS1519 오류가 발생한다.

 

 

728x90