Section 30.1: 사용자 구현 Enumerator 와 IEnumerable

IEnumerable 인터페이스를 구현 (implement) 하게 되면, 사용자의 클래스는 BCL 컬렉션들과 마찬가지의 방식으로 열거 (enumerate) 기능을 사용할 수 있게 된다. 이를 위해서는 열거 상태를 추적하는 상속된 Enumerator 클래스를 작성할 필요가 있다.

표준 컬렉션 이외의 대상을 요소 반복 (iterate) 할 필요가 있는 예제로는 다음과 같은 경우가 있을 수 있다:

  • 객체들의 컬렉션이 아닌, 함수로부터 생성되는 일정 범위의 숫자들을 요소 반복하고자 하는 경우
  • 컬렉션을 다른 방식으로 요소 반복하고자 하는 경우, 예를 들어 그래프를 나타내는 컬렉션에 대해 DFS 및 BFS 방식으로 탐색을 수행하는 경우
public static void Main(string[] args) { foreach(var coffee in new CoffeeCollection()) { Console.WriteLine(coffee); } } public class CoffeeCollection: IEnumerable { private CoffeeEnumerator enumerator; public CoffeeCollection() { enumerator = new CoffeeEnumerator(); } public IEnumerator GetEnumerator() { return enumerator; } public class CoffeeEnumerator: IEnumerator { string[] beverages = new string[3] { "espresso", "macchiato", "latte" }; int currentIndex = -1; public object Current { get { return beverages[currentIndex]; } } public bool MoveNext() { currentIndex++; if (currentIndex < beverages.Length) { return true; } return false; } public void Reset() { currentIndex = 0; } } }
본 문서는 C# Notes for Professionals (라이센스:CC-BY-SA) 를 한글로 번역한 문서입니다. 번역상 오류가 있을 수 있으므로 정확한 내용은 원본 문서를 참고하세요.

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

반응형

Chapter 30: IEnumerable

IEnumerableArrayList 와 같은 모든 generic 이 아닌 형태의 열거 (enumerate) 가능한 컬렉션들의 기본 인터페이스이다.

IEnumerator<T>List<> 와 같은 모든 generic 형태의 열거자들의 기본 인터페이스이다.

IEnumerableGetEnumerator 메소드를 구현 (implement) 하는 인터페이스이다. 이 GetEnumerator 메소드는 IEnumerator 를 반환하는데, 이는 foreach 등을 통해 컬렉션 내부를 요소 반복 (iterate) 할 수 있는 방법을 지원한다.

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

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

반응형

Section 29.2: 간단한 숫자 기반 반복기 (iterator) 예제

반복기가 자주 사용되는 상황 중 하나로, 숫자들로 이루어진 컬렉션을 대상으로 특정 동작을 수행하는 경우를 들 수 있다. 아래에 소개된 예제는 숫자로 이루어진 배열의 각 요소들이 개별적으로 콘솔에 출력되는 동작을 보여주고 있다.

이것이 가능한 이유는, 배열은 기본적으로 IEnumerable 인터페이스를 구현 (implement) 하기에, 사용자들이 GetEnumerator() 메소드를 통해 해당 배열 내 각 숫자들에 대해 읽기 전용이면서 전방향 전용인 커서를 갖는 열거자 (enumerator) 를 획득할 수 있다.

int[] numbers = { 1, 2, 3, 4, 5 }; IEnumerator iterator = numbers.GetEnumerator(); while (iterator.MoveNext()) { Console.WriteLine(iterator.Current); }

출력 결과

1 2 3 4 5

foreach 문을 이용하여서도 동일한 결과를 얻을 수 있다:

foreach (int number in numbers) { Console.WriteLine(number); }
본 문서는 C# Notes for Professionals (라이센스:CC-BY-SA) 를 한글로 번역한 문서입니다. 번역상 오류가 있을 수 있으므로 정확한 내용은 원본 문서를 참고하세요.

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

반응형

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/

반응형

Section 28.8: 반복문에서의 break 사용

경우에 따라, 반복문 수행 중간에 계속해서 수행을 더 진행하여야 할지 확인이 필요할 수 있다. 이러한 경우 아래 두가지 예제 중, 두말할 나위 없이 break 문을 사용한 첫번째 예제가 더욱 나은 방법일 것이다:

for (;;) { // should_end_loop 값을 설정할지를 결정하는 코드 if (should_end_loop) break; // 필요한 작업을 수행한다 }

다른 구현 방법:

bool endLoop = false; for (; !endLoop;) { // endLoop 값을 변경시킬지를 결정하는 코드 if (!endLoop) { // 필요한 작업을 수행한다 } }

유의 사항: 중첩 (nested) 반복문이나 switch 문 등을 사용하는 경우에는 단순한 하나의 break 문보다 더 추가적인 구현이 필요할 수 있다.

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

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

반응형

Section 28.7: While 반복문

int n = 0; while (n < 5) { Console.WriteLine(n); n++; }

출력 결과:

0 1 2 3 4

IEnumeratorwhile 문을 통해 요소 반복을 (iterate) 수행할 수 있다:

// 원하는 갯수를 인자로 받아 해당 갯수만큼의 가장 큰 도시들의 // 이름 목록을 IEnumerator 로 반환하는 함수흘 호출한다. IEnumerator<string> largestMetroAreas = GetLargestMetroAreas(4); while (largestMetroAreas.MoveNext()) { Console.WriteLine(largestMetroAreas.Current); }

출력 예제:

Tokyo/Yokohama New York Metro Sao Paulo Seoul/Incheon
본 문서는 C# Notes for Professionals (라이센스:CC-BY-SA) 를 한글로 번역한 문서입니다. 번역상 오류가 있을 수 있으므로 정확한 내용은 원본 문서를 참고하세요.

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

반응형

Section 28.6: 반복문에서의 continue 사용

반복문에서 사용되는 제어문에는 break 외에, continue 문도 존재한다. 전체 반복문을 완전히 빠져나가는 대신, 현재 차례의 반복 (iteration) 만을 건너뛰는 기능을 수행한다. 특정 값의 조건이 만족할 때 반복문 코드 일부가 수행되지 않기를 원하는 경우 유용하게 사용할 수 있다.

아래에 간단한 예제가 소개되어 있다:

for (int i = 1; i <= 10; i++) { if (i < 9) continue; Console.WriteLine(i); }

위 코드의 실행 결과는 다음과 같을 것이다:

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

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

반응형

'번역 > C# Notes for Professionals' 카테고리의 다른 글

28.8: 반복문에서의 break 사용  (0) 2021.09.17
28.7: While 반복문  (0) 2021.09.16
28.5: 중첩 (nested) 반복문  (0) 2021.09.15
28.4: 다양한 스타일의 반복문들  (0) 2021.09.15
28.3: Foreach 반복문  (0) 2021.09.08

Section 28.5: 중첩 (nested) 반복문

// 1에서 5까지의 두 숫자 쌍에 대한 곱 출력 for (int i = 1; i <= 5; i++) { for (int j = 1; j <= 5; j++) { int product = i * j; Console.WriteLine("{0} times {1} is {2}", i, j, product); } }
본 문서는 C# Notes for Professionals (라이센스:CC-BY-SA) 를 한글로 번역한 문서입니다. 번역상 오류가 있을 수 있으므로 정확한 내용은 원본 문서를 참고하세요.

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

반응형

'번역 > C# Notes for Professionals' 카테고리의 다른 글

28.7: While 반복문  (0) 2021.09.16
28.6: 반복문에서의 continue 사용  (0) 2021.09.16
28.4: 다양한 스타일의 반복문들  (0) 2021.09.15
28.3: Foreach 반복문  (0) 2021.09.08
28.2: Do - While 반복문  (0) 2021.09.03

+ Recent posts