์์
case 1
public void Test1()
{
Action print = delegate()
{
Console.WriteLine("A");
};
print();
}
- print๋ผ๋ delegate ๊ฐ์ฒด์ ๋ฌด๋ช
๋ฉ์๋๋ฅผ ์ ์ํ๊ณ ํ ๋น
- ์ด๊ฒ์ Closure๊ฐ ์๋๋ค
case 2
public void Test2()
{
Action<string> print = delegate (string msg)
{
Console.WriteLine(msg);
};
print("A");
}
- print๋ผ๋ delegate ๊ฐ์ฒด์ ํ๋ผ๋ฏธํฐ(string msg)๋ฅผ ๋ฐ๋ ๋ฌด๋ช
๋ฉ์๋๋ฅผ ์ ์ํ๊ณ ํ ๋น
- ์ด๊ฒ๋ Closure๊ฐ ์๋๋ค
case 3
public void Test3()
{
int key = 10;
Action<string> print = delegate (string msg)
{
string str = key + msg;
Console.WriteLine(str);
};
print("A"); // 10A
}
- delegate์ ํ ๋นํ ๋ฉ์๋์ ์ธ๋ถ ๋ณ์, Test3์ ์ง์ญ ๋ณ์์ธ key๋ฅผ ์ฌ์ฉ
- ์ด๊ฒ์ด Closure์ ์์
Clusore๋?
- ์ด๋ค ๋ฉ์๋๊ฐ ์๊ณ , ๊ทธ ๋ฉ์๋ ์์์ ๋ฌด๋ช
๋ฉ์๋๋ ๋๋ค์์ด ์ ์๋์ด ์๊ณ ์ง์ญ ๋ณ์๊ฐ ์ ์ธ๋์ด ์๋ค
- ์ด ๋ ์ ์๋ ๋ฌด๋ช
๋ฉ์๋ ํน์ ๋๋ค์์ด ์ด ์ง์ญ๋ณ์๋ฅผ ์ฌ์ฉํ๋ฉด ์ด๋ฅผ Clousre๋ผ ํ๋ค
- ์ธ๋ถ ํจ์์ ์ ๊ทผํ ์ ์๋ ๋ด๋ถ ํจ์ ํน์ ์ด๋ฌํ ์๋ฆฌ
- ์ผ๋ฐ์ ์ผ๋ก ์ด๋ค ํจ์๊ฐ ์๋ฉธํ๋ฉด์ ์คํ ํ๋ ์์ด ํด์ ๋์ง๋ง, ์ธ๋ถํจ์์ ์ง์ญ๋ณ์๋ฅผ ์ฌ์ฉํ๋ ๋ด๋ถ ํจ์๊ฐ ์๋ฉธํ ๋๊น์ง ์ธ๋ถํจ์๋ ์๋ฉธํ์ง ์์
- Lexcial scope๋ด์ Free variable์ ์ฌ์ฉํ๋ ์ผ๊ธํจ์(First-class function)
- ํจ์๊ฐ Context๋ฅผ ๋ณด์ ํ ์ ์๋๋ก ํ ๊ธฐ๋ฅ
- ์ฌ๊ธฐ์ Context๋ Closure๊ฐ ์ ์๋ ์ธ๋ถ ํจ์์ ๋ณ์๋ค
์ผ๊ธํจ์
- ๋ค๋ฅธ ๋ฉ์๋/ํจ์์ ํ๋ผ๋ฏธํฐ๋ก ์ ๋ฌํด์ ์ฌ์ฉํ ์ ์๋ ํจ์
- C#์์์ ๋ฌด๋ช
๋ฉ์๋, ๋๋ค์ ๋ฑ
- Action, Predicate, Func, delegate ๋ฑโฆ
์ด๋์ ์ฌ์ฉํ๋๊ฐ?
- ํจ์์ ์ฒซ ์ ์ ์์ ์์์ Context๋ฅผ ์ ์งํ ํ์๊ฐ ์์ ๋
class Class1
{
private List<string> list = new List<string>()
{
"A", "AB", "ABC", "ABCD", "ABCDE"
};
public IList<string> GetList(int maxLength)
{
// Where์ ํ ๋น๋๋ ํจ์๋ ์ธ๋ถ ๋ณ์์ธ maxLength๋ฅผ ์ฌ์ฉ
// ์๋ ๋๋ค์์ Closure
var limitedList = list.Where(p => p.Length <= maxLength).ToList();
return limitedList;
}
}
์ถ์ฒ