08 yield

vencott·2021년 6월 2일
0

C#

목록 보기
8/32

yield키워드는 호출자(Caller)에게 컬렉션 데이터를 하나씩 리턴할 때 사용한다

Enumerator(Iterator)와 같은 개념이며 집합적인 데이터셋으로부터 데이터를 하나씩 호출자에게 보내준다

사용

  • yield return
    • 컬렉션 데이터를 하나씩 리턴
  • yield break
    • 리턴을 중지하고 Iteration 루프를 빠져 나옴
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);
        }             
    }
}

원리

  1. yield return문에서 하나의 값을 리턴하고, 현재 위치를 기억해 둔다
  2. 호출자가 다시 루프를 돌아 다음 값을 메서드에 요청하면, 메서드의 기억된 위치 다음 문장부터 실행하여 다음 yield 문을 만나 값을 리턴한다

yield를 활용한 Enumerator

C#에서 Iterator 방식으로 yield 를 사용하면, 명시적으로 별도의 Enumerator 클래스를 작성할 필요가 없다

Enumerator는 데이타 요소를 하나씩 리턴하는 기능을 하는 것으로 C#/.NET에서 Enumerator는 IEnumerator 라는 인터페이스를 구현해야 한다

IEnumerator 인터페이스는 Current (속성), MoveNext() (메서드), Reset() (메서드) 등 3개의 멤버를 가지고 있으며 이중 Current, MoveNext()는 필수 구현 요소이다

호출

  1. foreach 문을 사용하여 C#에서 자동으로 Iterator 루프 처리를 하게 하는 방법
  2. GetEnumerator()로부터 IEnumerator 인터페이스를 얻어 MoveNext() 메서드와 Current 속성을 사용하여 개발자가 직접 수동으로 요소를 하나씩 사용하는 방법
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++;
            }
        }
    }
}

출처: http://www.csharpstudy.com/

profile
Backend Developer

0개의 댓글