50. 정적 지역 함수(static local function) vs 람다

난이도 중 해설 보기 →

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

결함 코드 · C#
// ============================================================================
// [언어 내부동작 문제] C# — 정적 지역 함수(static local function) vs 람다
// ----------------------------------------------------------------------------
// 주제:
//   람다/익명 메서드와 (정적) 지역 함수의 캡처 의미론과 힙 할당(클로저) 차이를
//   예측하고 설명하라. 게임서버 핫패스에서 불필요한 클로저 할당은 GC 압력을 만든다.
//
// 과제:
//   1) 아래 프로그램의 표준 출력을 순서대로 예측하라.
//   2) 각 경우에 컴파일러가 무엇을 생성하는지(클로저 클래스/캐시된 델리게이트/할당 없음)
//      (힙 할당 여부와 캡처 방식 포함) 설명하라: (a) 지역 변수를 캡처하는 람다,
//      (b) 정적 지역 함수, (c) 캡처 없는 람다,
//      (d) 반복문에서의 캡처.
//   3) static 키워드가 지역 함수에서 강제하는 제약과 그 성능적 의미를 설명하라.
//
// (참고: 이 파일은 개념 예측용이다. 출력과 근거를 함께 서술하라.)
// ============================================================================

using System;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        // (a) 지역 변수 캡처 람다
        int factor = 10;
        Action lambda = () => Console.WriteLine($"lambda factor={factor}");
        factor = 20;
        lambda();

        // (b) 정적 지역 함수 — 바깥 지역 변수 캡처 불가, 인자로만 받음
        static int Mul(int a, int b) => a * b;
        Console.WriteLine($"Mul={Mul(3, 4)}");

        // (c) 캡처 없는 람다
        Func<int, int> square = x => x * x;
        Console.WriteLine($"square={square(5)}");

        // (d) 반복문에서 캡처(반복마다 새 지역 변수)
        var actions = new List<Action>();
        for (int i = 0; i < 3; i++)
        {
            int copy = i;
            actions.Add(() => Console.Write(copy + " "));
        }
        foreach (var a in actions) a();
        Console.WriteLine();
    }
}
내 리뷰 · C#
내 답안 · 자동 저장

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