Computer >> 컴퓨터 >  >> 프로그래밍 >> C#

C# 반복자(Iterator) 완벽 정리: yield return로 컬렉션 순회하기

반복자(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 인터페이스를 직접 구현하지 않아도 되므로 코드가 간결해지고 가독성이 크게 향상됩니다. 대용량 데이터를 처리할 때 필요한 시점에만 요소를 생성하므로 메모리 효율성 측면에서도 유리합니다.