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

C# yield return 키워드의 용도와 동작 원리 완벽 가이드

C#의 yield 키워드는 컬렉션에 대해 사용자 정의 상태 기반 반복(stateful iteration)을 수행할 수 있게 해주는 강력한 도구입니다. yield를 사용하면 호출자(caller)와 소스 코드 사이에서 제어 흐름이 앞뒤로 오가며, 각 요소를 하나씩 순차적으로 반환할 수 있습니다.

예제 코드

using System;
using System.Collections.Generic;

namespace DemoApplication {
    class Program {
        static List<int> numbersList = new List<int> {
            1, 2, 3, 4, 5
        };

        public static void Main() {
            foreach(int i in RunningTotal()) {
                Console.WriteLine(i);
            }
            Console.ReadLine();
        }

        public static IEnumerable<int> RunningTotal() {
            int runningTotal = 0;
            foreach(int i in numbersList) {
                runningTotal += i;
                yield return (runningTotal);
            }
        }
    }
}

실행 결과

위 프로그램을 실행하면 다음과 같은 결과가 출력됩니다.

1
3
6
10
15

동작 원리

위 예제에서 Main 메서드의 foreach 루프는 RunningTotal() 메서드가 반환하는 누적 합계 시퀀스를 순회합니다. yield return이 실행될 때마다 제어가 Main 메서드의 foreach 루프로 돌아와 해당 값을 출력하고, 출력이 완료되면 다시 RunningTotal 메서드 내부의 foreach 루프로 돌아가 다음 요소를 처리합니다.

여기서 주목해야 할 중요한 특징은 이전 값(실행 상태)이 그대로 보존된다는 점입니다. 일반 메서드라면 실행이 끝나면 지역 변수가 모두 사라지지만, yield를 사용한 이터레이터는 마치 일시 정지 후 재개되는 것처럼 변수의 상태를 유지합니다.

yield return의 주요 장점

  • 지연 평가(Lazy Evaluation): 전체 컬렉션을 한 번에 계산하지 않고, 필요한 시점에 요소를 하나씩 생성하므로 불필요한 연산을 줄일 수 있습니다.
  • 메모리 효율성: 모든 결과를 담은 리스트를 미리 만들 필요 없이 스트림처럼 데이터를 처리하기 때문에 대용량 데이터에서도 메모리 사용량이 적습니다.
  • 간결한 이터레이터 구현: IEnumerable 인터페이스를 직접 구현하는 복잡한 코드 없이도 사용자 정의 반복 로직을 손쉽게 작성할 수 있습니다.

정리하면, yield 키워드는 컬렉션 항목에 대한 지연 열거(lazy enumeration)를 효과적으로 생성하여, 단순히 리스트를 반환하는 방식보다 훨씬 더 효율적이고 유연한 반복 처리를 가능하게 해줍니다.