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

C# 반복자(Iterator) 메서드 완벽 이해하기

C#에서 반복자(Iterator) 메서드는 컬렉션에 대해 사용자 지정 반복을 수행하는 특별한 메서드입니다. 핵심은 yield return 문을 사용한다는 점으로, 컬렉션의 각 요소를 한 번에 하나씩 순차적으로 반환합니다.

반복자 메서드의 가장 큰 특징은 현재 실행 위치를 기억한다는 것입니다. 따라서 다음 반복이 호출될 때 처음부터 다시 시작하지 않고, 중단되었던 위치 바로 다음 요소를 반환하게 됩니다.

반복자 메서드 예제

다음은 C#에서 반복자 메서드를 구현한 기본적인 예제입니다.

using System;
using System.Collections.Generic;
using System.Linq;

namespace Demo {
    class Program {
        public static IEnumerable display() {
            int[] arr = new int[] {99,45,76};

            foreach (var val in arr) {
                yield return val.ToString();
            }
        }

        public static void Main(string[] args) {
            IEnumerable ele = display();
            foreach (var element in ele) {
                Console.WriteLine(element);
            }
        }
    }
}

실행 결과

99
45
76

코드 상세 분석

위 예제에서 display()라는 이름의 반복자 메서드를 정의했습니다. 이 메서드는 yield 문을 활용하여 배열의 요소를 한 번에 하나씩 반환합니다.

public static IEnumerable display() {
    int[] arr = new int[] {99,45,76};

    foreach (var val in arr) {
        yield return val.ToString();
    }
}

메서드 내부 동작 방식을 살펴보면 다음과 같습니다.

먼저 정수 배열 {99, 45, 76}을 생성하고, foreach 루프로 각 요소를 순회하면서 yield return을 통해 문자열로 변환된 값을 반환합니다. 여기서 yield return이 실행될 때마다 메서드의 실행이 일시 중단되며, 호출자에게 값이 전달됩니다.

그다음 반환된 결과는 IEnumerable 타입 변수에 저장되며, 이를 다시 foreach 문으로 순회하면서 각 요소를 콘솔에 출력합니다.

IEnumerable ele = display();
foreach (var element in ele) {
    Console.WriteLine(element);
}

yield return의 장점

yield return을 사용하는 반복자 메서드는 다음과 같은 이점을 제공합니다.

지연 실행(Lazy Evaluation): 모든 요소를 미리 계산하지 않고, 요청 시점에 하나씩 생성하므로 메모리 효율성이 뛰어납니다.

상태 유지: 별도의 인덱스 변수나 상태 관리 코드 없이도 컴파일러가 자동으로 현재 위치를 추적합니다.

간결한 코드: 임시 컬렉션을 만들어 값을 채우는 방식보다 훨씬 직관적이고 읽기 쉬운 코드를 작성할 수 있습니다.

대용량 데이터를 처리하거나 무한 시퀀스를 다룰 때 반복자 메서드는 특히 유용한 패턴이므로, C# 개발자라면 반드시 익혀두어야 할 핵심 기능입니다.