Section 29.1: yield 문을 이용하여 반복기 (iterator) 생성하기

C# 에서 요소 반복을 위하여 사용되는 열거자 (enumerator) 는 yield 문을 포함한 반복기 메소드 (iterator method) 나 속성 (property), 혹은 인덱서 등을 선언함으로써 생성할 수 있다.

역주 : 원문에서는 iterator 라는 용어에 iterator method 개념을 포함하여 설명하고 있어, 보다 쉬운 이해를 위해 임의로 용어를 구분하여 번역하였습니다. 원문의 의도와 다를 수 있으니 원문 및 MS 문서 참고 부탁드립니다.

대부분의 메소드들은 일반적인 return 문을 사용하여 제어권을 호출자에게 돌려주는데, 이 과정에서 메소드에 속한 로컬 상태정보는 모두 정리 (dispose) 되게 된다. 반면에, yield 문을 사용하는 메소드는 호출자에게 여러가지의 값을 요청시마다 반환해줄 수 있으며, 이러한 값 반환 시점 사이에도 메소드에 속한 로컬 상태정보는 모두 유지된다. 이렇게 반환된 값들은 주로 일종의 연속된 규칙을 갖는 값들을 나타낸다.

반복기 메소드 (iterator method) 에서 yield 문을 사용하는 경우는 다음과 같이 두가지 종류가 있다:

  • yield return 문, 제어권을 호출자에게 반환하지만 메소드에 속한 로컬 상태정보는 유지한다. 피호출자 (callee) 에게 제어권이 다시 넘어올 경우, 현재 라인에서부터 실행이 계속하여 이어질 (continue) 것이다.
  • yield break 문, 일반적인 return 문과 동일한 기능을 하며, 연속된 규칙을 갖는 값들의 마지막에 도달했음을 나타낸다. 반복기 메소드 (iterator method) 블럭 내에서는 일반적인 return 문의 사용은 금지되어 있다.

아래의 예제는 피보나치 수열을 생성하기 위하여 사용할 수 있는 반복기 메소드 (iterator method) 를 보여주고 있다:

IEnumerable<int> Fibonacci(int count) { int prev = 1; int curr = 1; for (int i = 0; i < count; i++) { yield return prev; int temp = prev + curr; prev = curr; curr = temp; } }

이 반복기 메소드 (iterator method) 는 피보나치 수열을 생성하는 열거자 (enumerator) 를 생성하기 위해 사용되며, 다른 메소드는 이 열거자 (enumerator) 를 통해 사용할 값들을 뽑아낼 수 있다. 아래의 예제는 피보나치 수열의 첫 열개 항목을 순회 (enumerate) 하는 방법을 보여주고 있다:

void Main() { foreach (int term in Fibonacci(10)) { Console.WriteLine(term); } }

Output

1 1 2 3 5 8 13 21 34 55
본 문서는 C# Notes for Professionals (라이센스:CC-BY-SA) 를 한글로 번역한 문서입니다. 번역상 오류가 있을 수 있으므로 정확한 내용은 원본 문서를 참고하세요.

[출처] https://books.goalkicker.com/CSharpBook/

반응형

+ Recent posts