728x90
아래 코드는 어떤 결과가 출력될까?
정답은 "10"이 10번 출력된다.
클로저(Closure)
Lexical scope 내의 변수를 사용하는 일급 함수를 말한다.
Lexical scope
변수가 참조될 수 있는 영역.
일급 함수(first-class functions)
함수가 다른 변수를 다루는 것처럼 취급할 수 있을 때 그 언어는 일급 함수를 갖는다고 한다.
C#에서 anonymous method, lambda expression로 일급 함수를 지원한다.
다시 예시로 돌아가자.
List<Action> list = new();
for (int i = 0; i < 10; i++)
{
list.Add(() => Debug.WriteLine($"{i}"));
}
list.ForEach(action => action());
아래 일급 함수(lambda expression)에서 lexical scope에 있는 로컬 변수(free variable)인 i를 사용한다.
따라서 아래 일급 함수를 Closure라고 한다.
() => Debug.WriteLine($"{i}");
그리고 이 경우 로컬 변수 i 를 저장하기 위해서 로컬 변수의 값이 아니라 로컬 변수의 참조를 저장한다.
따라서 action이 실행되는 시점에는 i의 최종 값인 10이 출력된다.
최근에 lambda expression 사용이 많아지면서 주의하고 있어야 할 것 같다.
728x90
'Programming > C#' 카테고리의 다른 글
[C#] Linq SingleOrDefault() vs FirstOrDefault() (0) | 2024.02.17 |
---|---|
[C#] BsonDocument를 JSON으로 변환하기 (0) | 2024.02.09 |
[C#] Any() vs Count() 성능 비교 (0) | 2022.10.12 |
[C#] Linq로 INNER JOIN하기 (0) | 2022.08.24 |
C# Linq 시각화 (0) | 2022.08.10 |
댓글