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#
내 답안 · 자동 저장
작성 후 위 해설 보기에서 모범 해설과 대조하세요.