[C# 문법] C# Closure : 반복문 내 람다식 사용 방법
- C#/C# 문법
- 2021. 7. 25. 17:55
안녕하세요. 오늘은 C# 문법에서 클로저(Closure) 에 대해서 알아보려고 합니다.
참조
클로저(Closure)란?
- 클로저(Closure)란, 외부 변수나 필드와 같은 '환경' 을 저장하고 있는 함수를 뜻합니다.
- C#에서는 람다식을 사용하여 해당 내용을 전달할 때, 외부의 변수나 필드를 사용하는 경우 Closure 처리가 됩니다.
- 클로저 처리되는 예를 먼저 보도록 하겠습니다.
클로저 예시
using System;
namespace ConsoleApp7
{
class Program
{
static void Main(string[] args)
{
int length = 10;
var actions = new Action[length];
Console.WriteLine($"클로저(Closure) 문제 예시");
for (var index = 0; index < length; index++)
{
actions[index] = () => Console.WriteLine(index);
}
foreach (var item in actions)
{
item?.Invoke();
}
}
}
}
실행 결과
클로저(Closure) 문제 예시
10
10
10
10
10
10
10
10
10
10
- 위의 코드를 실행 시켜본 결과, index의 값이 모두 10으로 출력되는 문제가 발생하였습니다.
- 즉, 클로저로 처리되지 않았다는 얘기 입니다.
- 클로저로 처리되기 위해서는 다음과 같이 코드를 변경하여야 합니다.
클로저 해결 예시
using System;
namespace ConsoleApp7
{
class Program
{
static void Main(string[] args)
{
int length = 10;
var actions = new Action[length];
Console.WriteLine($"클로저 Closure 문제 해결");
for (var index = 0; index < length; index++)
{
var localIndex = index;
actions[index] = () => Console.WriteLine(localIndex);
}
foreach (var item in actions)
{
item?.Invoke();
}
}
}
}
실행 결과
클로저 Closure 문제 해결
0
1
2
3
4
5
6
7
8
9
- 람다식을 사용할 때, 외부 변수나 필드를 사용하면서 클로저 이슈를 피하려면 단순 값이 아니라 변수 그 자체를 참조하여 저장하도록 하여 사용해야 합니다.
728x90
'C# > C# 문법' 카테고리의 다른 글
[C# 문법] C# Dictionary 같은 Key 에 여러개의 데이터 넣기 (0) | 2021.07.28 |
---|---|
[C# 문법] C# 문자열 내 숫자만 필터하기 (0) | 2021.07.26 |
[C# 문법] C# 확장 메서드 (0) | 2021.07.23 |
[C# 문법] C# Linq 디버깅 하는 방법 (1) | 2021.07.23 |
[C# 문법] C# 특정 문자열 기준 맨 끝에서 자르기 (0) | 2021.07.15 |
이 글을 공유하기