반복자(Iterator)는 컬렉션(collection) 위에서 사용자가 정의한 방식으로 반복 작업을 수행하는 기능입니다. C#에서는 yield return 문을 사용하여 컬렉션의 각 요소를 한 번에 하나씩 반환할 수 있습니다.
반복자의 핵심 특징은 현재 위치를 기억한다는 점입니다. 즉, 호출이 중단되었다가 다시 실행될 때 처음부터 시작하는 것이 아니라, 마지막으로 반환한 요소의 다음 요소부터 이어서 반환합니다.
반복자의 동작 원리
- 메서드 내부에서
yield return을 만나면 해당 값을 호출자에게 반환하고 실행을 일시 중지합니다. - 호출자가 다음 요소를 요청하면 중지된 지점부터 실행을 재개합니다.
- 반복자 메서드의 반환 타입은
IEnumerable<T>또는IEnumerator<T>여야 합니다.
예제 코드
아래 예제는 반복자 메서드 display()를 통해 배열의 요소를 하나씩 문자열로 변환하여 반환하는 코드입니다.
using System;
using System.Collections.Generic;
using System.Linq;
namespace Demo {
class Program {
public static IEnumerable<string> display() {
int[] arr = new int[] {99,45,76};
foreach (var val in arr) {
yield return val.ToString();
}
}
public static void Main(string[] args) {
IEnumerable<string> ele = display();
foreach (var element in ele) {
Console.WriteLine(element);
}
}
}
}실행 결과
99 45 76
코드 상세 분석
1. 반복자 메서드 정의
위 예제에서 display() 메서드는 yield return 문을 사용해 배열의 요소를 한 번에 하나씩 반환합니다. 이때 정수 값은 ToString()으로 문자열로 변환되어 전달됩니다.
public static IEnumerable<string> display() {
int[] arr = new int[] {99,45,76};
foreach (var val in arr) {
yield return val.ToString();
}
}2. 결과 저장 및 출력
반복자 메서드가 반환한 결과는 IEnumerable<string> 변수에 저장되며, foreach 루프를 통해 각 요소가 순차적으로 반복되면서 콘솔에 출력됩니다.
IEnumerable<string> ele = display();
foreach (var element in ele) {
Console.WriteLine(element);
}정리
C#의 반복자는 yield return만으로 지연 실행(lazy evaluation) 방식의 컬렉션 순회를 손쉽게 구현할 수 있게 해줍니다. 별도의 클래스를 만들어 IEnumerator 인터페이스를 직접 구현하지 않아도 되므로 코드가 간결해지고 가독성이 크게 향상됩니다. 대용량 데이터를 처리할 때 필요한 시점에만 요소를 생성하므로 메모리 효율성 측면에서도 유리합니다.