โ ํด๋ก์ (Closure)
C#์์ ํด๋ก์ ๋ ๋๋ค์์ด๋ ์ต๋ช ๋ฉ์๋๊ฐ ํด๋น ๋ฉ์๋๊ฐ ์ ์ธ๋ ๋ฒ์(scope) ๋ฐ์์๋ ํด๋น ๋ฒ์์ ์๋ ๋ณ์๋ค์ ์ ๊ทผํ ์ ์๋๋ก ํ๋ ๋ฉ์ปค๋์ฆ์ ์๋ฏธํ๋ค.
- ๊ธฐ๋ณธ ๊ฐ๋
ํด๋ก์ ๋ ๋ณ์์ ์ ํจ ๋ฒ์(scope)์ ์๋ช ์ฃผ๊ธฐ(lifecycle)๋ฅผ ํ์ฅ์์ผ ์ค๋ค. ์ฆ, ์ด๋ค ํจ์๊ฐ ํน์ ๋ฒ์ ๋ด์์ ์ ์ธ๋ ๋ณ์๋ฅผ ์บก์ฒ(capture)ํ๊ณ , ๊ทธ ๋ณ์๊ฐ ํด๋น ๋ฒ์๋ฅผ ๋ฒ์ด๋ ํ์๋ ๊ณ์ํด์ ์ ๊ทผ ๊ฐ๋ฅํ๋๋ก ๋ง๋ค์ด ์ค๋ค.
- C#์์ ํด๋ก์ ์ ๋์ ๋ฐฉ์
C#์์ ํด๋ก์ ๋ ์ฃผ๋ก ๋๋ค์๊ณผ ์ต๋ช ๋ฉ์๋์ ํจ๊ป ์ฌ์ฉ๋๋ค. ์๋ฅผ ๋ค์ด, ๋๋ค์์ ๋ฉ์๋ ๋ด์์ ์ง์ญ ๋ณ์๋ฅผ ์บก์ฒํ ์ ์์ผ๋ฉฐ, ํด๋น ๋๋ค์์ด ๋ฉ์๋ ํธ์ถ์ด ์ข ๋ฃ๋ ์ดํ์๋ ์บก์ฒ๋ ๋ณ์์ ์ ๊ทผํ ์ ์๋๋ก ํ๋ค.
int counter = 0; // ์ธ๋ถ ๋ณ์
Func<int> incrementCounter = () =>
{
counter++; // ์ธ๋ถ ๋ณ์๋ฅผ ์บก์ฒ
return counter;
};
Console.WriteLine(incrementCounter()); // ์ถ๋ ฅ: 1
Console.WriteLine(incrementCounter()); // ์ถ๋ ฅ: 2
Console.WriteLine(incrementCounter()); // ์ถ๋ ฅ: 3
incrementCounter ๋๋ค์์ counter ๋ผ๋ ์ธ๋ถ ๋ณ์์ ์ฐธ์กฐ๋ฅผ ์บก์ฒํ๋ค.
โ ์บก์ฒ ์์
ํด๋ก์ ๋ ๋ณ์์ ๊ฐ์ด ์๋๋ผ ์ฐธ์กฐ๋ฅผ ์บก์ฒํ๋ค. ๋ฃจํ ๋ด์์ ํด๋ก์ ๋ฅผ ์์ฑํ๋ ๊ฒฝ์ฐ, ๋ชจ๋ ํด๋ก์ ๊ฐ ๋์ผํ ๋ณ์์ ์ฐธ์กฐ๋ฅผ ๊ณต์ ํ๊ฒ ๋๋ค.
List<Func<int>> actions = new List<Func<int>>();
for (int i = 0; i < 3; i++)
{
actions.Add(() => i);
}
foreach (var action in actions)
{
Console.WriteLine(action()); // ๋ชจ๋ 3์ ์ถ๋ ฅ
}
๋ฃจํ ๋ด์์ ๋ณ์ i ๋ฅผ ์บก์ฒํ๋ ๋๋ค์์ ๋ฆฌ์คํธ์ ์ถ๊ฐํ์ง๋ง, ๋ชจ๋ ๋๋ค์์ด ๋์ผํ ๋ณ์ i ์ ์ฐธ์กฐ๋ฅผ ๊ฐ์ง๋ฏ๋ก ๋ฃจํ๊ฐ ๋๋ ํ i ์ ๊ฐ์ด 3์ด ๋์ด ๋ชจ๋ ๋๋ค์์ด 3์ ์ถ๋ ฅํ๊ฒ ๋๋ค.
โ ๊ฐ๋น์ง ์ปฌ๋ ์
ํด๋ก์ ๋ ๋ณ์์ ์๋ช ์ฃผ๊ธฐ๋ฅผ ์ฐ์ฅ์ํค๋ฏ๋ก, ์๋ ๋ฒ์๋ฅผ ๋ฒ์ด๋ ๋ ๊ฐ๋น์ง ์ปฌ๋ ํฐ์ ์ํด ์์ง๋์ด์ผ ํ ๋ณ์๊ฐ ํด๋ก์ ์ ์ํด ์ ์ง๋๋ค. ์ด๋ ๋ฉ๋ชจ๋ฆฌ ๋์๋ฅผ ์ด๋ํ ์ ์๋ค.
'๐ C#' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| ์ต๋ช ๋ฉ์๋, ๋๋ค ํํ์ (0) | 2024.08.29 |
|---|---|
| ์ด๋ฒคํธ(Event), ๋ธ๋ฆฌ๊ฒ์ดํธ(Delegate) (0) | 2024.08.29 |
| ๊ฐ์ฒด ์งํฅ ์ค๊ณ 5๊ฐ์ง ์์น (SOLID) (0) | 2024.08.23 |
| ์์กด์ฑ ์ฃผ์ (Dependency Injection, DI) (0) | 2024.08.20 |
| ๋คํ์ฑ(Polymorphism), ๋ฐํ์ ๋คํ์ฑ, ์ปดํ์ผ ํ์ ๋คํ์ฑ (0) | 2024.08.20 |