2. 클로저 캡처와 지연 실행(for vs foreach, LINQ)

난이도 중 해설 보기 →

결함을 모두 찾고 원인·수정안·더 나은 설계를 제시하라. 마커 (A)(B) 는 주목 위치 힌트다.

결함 코드 · C#
// ============================================================================
// [언어 내부동작 문제] C# - 클로저 캡처와 지연 실행(for vs foreach, LINQ)
// ----------------------------------------------------------------------------
// 주제:
//   람다가 변수를 "값이 아니라 변수 자체로" 캡처한다는 점, for 루프 변수와 foreach
//   반복 변수의 캡처가 다르게 동작하는 이유(C# 5 이후), 그리고 LINQ 의 지연 실행이
//   캡처된 변수의 "나중 값"을 보는 현상.
//
// 과제:
//   1) 아래 Main 의 세 블록이 각각 무엇을 출력하는지 정확히 예측하라.
//   2) for 블록과 foreach 블록의 출력이 왜 다른지(루프 변수의 수명/스코프) 설명하라.
//   3) LINQ 블록에서 threshold 를 바꾼 뒤 열거하면 왜 그런 결과가 나오는지(지연 실행 +
//      변수 캡처) 설명하라.
//   (먼저 직접 예측·설명을 적은 뒤 answer.md 와 대조할 것)
// ============================================================================

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

public class Program
{
    public static void Main()
    {
        // 1) for 루프 변수 캡처
        var forActions = new List<Action>();
        for (int i = 0; i < 3; i++)
            forActions.Add(() => Console.Write(i + " "));
        foreach (var a in forActions) a();
        Console.WriteLine();

        // 2) foreach 반복 변수 캡처
        var foreachActions = new List<Action>();
        foreach (var n in new[] { 10, 20, 30 })
            foreachActions.Add(() => Console.Write(n + " "));
        foreach (var a in foreachActions) a();
        Console.WriteLine();

        // 3) LINQ 지연 실행 + 캡처된 변수
        int threshold = 2;
        var src = new[] { 1, 2, 3, 4 };
        var q = src.Where(x => x > threshold);
        threshold = 0;                          // 쿼리 정의 후 변경
        Console.WriteLine(string.Join(",", q));
    }
}
내 리뷰 · C#
내 답안 · 자동 저장

작성 후 위 해설 보기에서 모범 해설과 대조하세요.