본문 바로가기
Programming/C#

[C#] Closure 문제

by 째스터 2022. 10. 21.
728x90

아래 코드는 어떤 결과가 출력될까?

IDE가 주의를 준다. 왜 일까?

정답은 "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

댓글