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