더북(TheBook)

IEnumerable<T>로 컬렉션 형태의 데이터 반환받기

IEnumerable<int>, IEnumerable<string> 형태의 IEnumerable<T> 제네릭 인터페이스를 사용하면 메서드를 구현할 때 컬렉션 형태의 반환값을 받고, 이를 foreach 문으로 접근할 수 있습니다.

배열에 저장된 값 중에서 특정 값보다 큰 데이터만 가져올 때 yield return을 사용한 것과 그렇지 않은 것의 코드를 비교해 보겠습니다. 어느 것이 더 좋다고 할 수 없지만 yield return을 사용하면 추가적인 List<T> 형태의 컬렉션 클래스가 없어도 구현할 수 있습니다.

> using System.Collections.Generic;
>
> //① yield 사용 전: List<T> 형태의 컬렉션 클래스를 임시로 사용하여 결괏값 저장 후 반환
> static IEnumerable<int> Greater1(int[] numbers, int greater)
. {
.     List<int> temp = new List<int>();
.     foreach (var n in numbers)
.     {
.         if (n > greater)
.         {
.             temp.Add(n);
.         }
.     }
.     return temp;
. }
>
> //② yield 사용 후: 추가 클래스 사용 없이 여러 데이터를 yield return으로 반환
> static IEnumerable<int> Greater2(int[] numbers, int greater)
. {
.     foreach (var n in numbers)
.     {
.         if (n > greater)
.         {
.             yield return n;
.         }
.     }
. }
>
> int[] numbers = { 1, 2, 3, 4, 5 };
> foreach (var n in Greater1(numbers, 3))
. {
.     Console.WriteLine(n);
. }
4
5
> foreach (var n in Greater2(numbers, 3))
. {
.     Console.WriteLine(n);
. }
4
5

List<T> 제네릭 클래스를 사용하여 데이터 여러 개를 담아 한 번에 반환하는 방식입니다. 과 기능이 동일하지만 추가적인 제네릭 클래스를 사용하지 않고 바로 yield return 코드로 여러 데이터를 반환합니다. 이처럼 yield return으로 반복해서 처리해야 하는 데이터를 반환할 때 유용하게 사용할 수 있습니다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.