public class Program

{

Action action;

public static void Main(string[] args)

{

CreateClosure();

action();

}


CreateClosure()

{

int a = 5;

action = () => Console.WriteLine(a);

}

}


๋‚ด๊ฐ€์•Œ๊ธฐ๋ก  ํด๋กœ์ €๋Š” ์™ธ๋ถ€๋ณ€์ˆ˜์˜ ์ฐธ์กฐ๋ฅผ ์ €์žฅํ•œ๋‹ค๊ณ  ์•Œ๊ณ  ์žˆ์–ด.

๊ทผ๋ฐ ์™ธ๋ถ€๋ณ€์ˆ˜๋ผ ํ•ด๋„ a๋Š” ์ง€์—ญ๋ณ€์ˆ˜๋‹ˆ๊นŒ stack frame์„ ๋”ฐ๋ผ stack์— ์ €์žฅ๋ ๊ฑฐ์ž–์•„?

๊ทธ๋ž˜์„œ CreateClosure()ํ•จ์ˆ˜๊ฐ€ ๋๋‚ ๋•Œ a๊ฐ€ ํ•ด์ œ๋  ํ…๋ฐ ์ด๋•Œ action์˜ ํด๋กœ์ ธ๋Š”ย 

1) ์—ฌ์ „ํžˆ a์˜ ์Šคํƒย ์ฃผ์†Œ๋ฅผ ์ฐธ์กฐํ•˜๊ณ  ์žˆ๋Š”๊ฑด์ง€(a๋Š” ํ•ด์ œ๋˜์ง€ ์•Š๊ณ  stack์„ ์ ์œ ํ•˜๊ณ  ์žˆ๋Š”๊ฑด์ง€)

2) a๊ฐ€ ํ•ด์ œ๋˜๊ธฐ ์ „ ํ•ด๋‹น ๊ฐ’์„ ๋ณต์‚ฌํ•ด์„œ ๊ฐ€์ง€๊ณ  ์žˆ๋Š”๊ฑด์ง€

๊ฐ€ ๊ถ๊ธˆํ•ด


stack์„ ๊ณ„์† ์ ์œ ํ•˜๊ณ  ์žˆ์œผ๋ฉด stack์ด ๋ถˆ์—ฐ์†ํ•ด์ ธ์„œ ์ด๊ฑด ์•„๋‹๊ฑฐ ๊ฐ™๊ธดํ•ด.