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์ด ๋ถ์ฐ์ํด์ ธ์ ์ด๊ฑด ์๋๊ฑฐ ๊ฐ๊ธดํด.
์ง๊ธ ๋ง๋ ์ฝ๋๋ก ๋ดค์๋๋ CreateClosure๊ฐ ํธ์ถ๋ ๋ a๋ผ๋ ๊ฐ์ฒด๊ฐ ๋ฉ๋ชจ๋ฆฌ์ ๋ค์ด๊ฐ๊ณ ๋์ค์ action์ด ์ํ๋๋ฉด ํด๋น a๊ฐ ๋ถ๋ฌ์์ ์คํ๋จ. createclosure๊ฐ ๋๋๋๋ผ๋ actionํจ์๊ฐ a๋ฅผ ์ฐธ์กฐํ๊ณ ์์ด์ ํด์ ๋์ง ์์.
1๋ฒ๊ณผ 2๋ฒ์ ๋๋ค๊ฐ๋ฅํ๋ฐ ์ง๊ธ ์ฝ๋๊ธฐ์ค์ผ๋ก๋ 2๋ฒ์ธ๊ฑฐ๊ณ 1๋ฒ์ ํ๋ ค๋ฉด intํ์ด ์๋๋ผ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ๋ ๋ฐฉ์์ผ๋ก ๋ณ๊ฒฝํด์ฃผ๋ฉด๋จ
๊ฐ๋จํ๊ฒ CreateClosure(int a) { action = () => Console.WriteLine(a); }
์ ์ดํด๋์ด ๊ณ ๋ง์~
https://stackoverflow.com/questions/31586153/deep-diving-into-the-implementation-of-closures
ํ์
๋ค์ด๊ฐ๋๋ฏ
์ ๊ทธ๋ผ ์ ๊ธฐ์ int a๋ ์ปดํ์ผ ์ดํ๋ก ์ ์ธ์์ ๋ถํฐ ์ด๋ฏธ ํด๋์ค์ ๋ณ์์ทจ๊ธ์ด๊ตฌ๋?
์ค์ฝํ ๋น ์ ธ๋์ฌ๋๊น์ง ํ์๋ค์ด๊ฐ+๊ทธ๋์ gc๋ ๋ฐ์ํจ
์์ ์ด๋ ค์ ๋ ๋ก์ปฌ ๋ฉ์๋ ์ธ๋
์ด๋ฐ ๊ธ์ ๋ณด๋ Lua์ ํด๋ก์ ๊ฐ ์์ผ ๋๋จํ๊ฒ ๋๊ปด์ง๋ค