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

Section 28.4: 다양한 스타일의 반복문들

while

가장 흔하게 사용되는 형태의 반복문이다. 이 이 방식의 한가지 단점은 반복문 수행이 얼마나 진행되고 있는지에 대해 확인할 수 있는 정보가 기본적으로 제공되지 않는다는 것이다.

/// condition 으로 표현된 조건이 만족되는 동안 반복문이 계속하여 수행된다 while(condition) { /// 반복 작업을 수행한다 }

do

while 문과 유사하나, 조건문 만족 여부 확인을 반복문의 시작 지점이 아닌 끝 지점에서 수행한다는 차이점이 있다. 이로 인해 반복문에 기술된 동작이 최소 한번은 무조건 실행되는 특징을 가지고 있다.

do { /// 반복 작업을 수행한다 } while(condition) /// condition 으로 표현된 조건이 만족되는 동안 반복문이 계속하여 수행된다

for

또하나의 흔히 사용되는 형태의 반복문이다. 반복문 수행시마다 인덱스 값 (이 예제에서는 i) 이 증가하며 해당 값을 활용할 수 있다. 주로 배열을 다루기 위해 사용된다.

for ( int i = 0; i < array.Count; i++ ) { var currentItem = array[i]; /// "currentItem" 을 이용해 작업을 수행한다 }

foreach

IEnumarable 객체를 요소 반복하는 보다 세련된 방법이다. 현재 객체의 인덱스 값이나 리스트의 전체 갯수 등을 전혀 신경쓰지 않아도 된다는 장점이 있다.

foreach ( var item in someList ) { /// "item" 에 대하여 원하는 작업을 수행한다 }

ForEach 메소드

다른 반복문 스타일들은 주로 컬렉션에서 특정 요소를 선택하거나 갱신하기 위해 사용된다면, 이 스타일은 주로 컬렉션의 모든 요소들을 대상으로 특정 메소드를 바로 불러주기 위해 사용된다.

list.ForEach(item => item.DoSomething()); // 혹은 list.ForEach(item => DoSomething(item)); // 혹은 method group 을 호출한다 list.ForEach(Console.WriteLine); // 배열에 대해 사용하기 Array.ForEach(myArray, Console.WriteLine);

기억해야 할 중요한 점은 이 메소드는 List<T> 인스턴스들과 배열에 대한 정적 메소드 (static method) 로만 제공된다는 것이다 - 이는 LINQ 의 일부분이 아니다.

LINQ 병렬 (Parallel) Foreach

LINQ 버전의 ForEach 라고 볼 수 있으나, 한가지 차이점은 이는 원하는 반복 작업을 병렬적으로 수행한다는 점이다. 이것이 의미하는 바는 컬렉션 내의 모든 요소들에 대한 작업 수행이 동시에 일제히 일어난다는 것이다.

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

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

반응형

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

28.6: 반복문에서의 continue 사용  (0) 2021.09.16
28.5: 중첩 (nested) 반복문  (0) 2021.09.15
28.3: Foreach 반복문  (0) 2021.09.08
28.2: Do - While 반복문  (0) 2021.09.03
28.1: For 반복문  (0) 2021.08.27

+ Recent posts