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으로 반복해서 처리해야 하는 데이터를 반환할 때 유용하게 사용할 수 있습니다.