본문 바로가기
C#

[C#] Closure(클로저) 이해하기

by 코모's 2023. 5. 2.
반응형

Closure

Closure(클로저) 란, 외부 변수나 필드와 같은 "환경"을 저장하고 있는 함수이다.

람다식을 사용해 전달할 때, 외부의 변수나 필드를 사용하는 경우 클로저로 처리된다.

 

Action<int> print = delegate (int j)
    {                
        Console.WriteLine(j);
    };

위 코드에서는 외부변수를 참조하지 않기 때문에 클로저가 아니다.

 

int i = 2;
Action<int> print = delegate (int j)
    {    	
        Console.WriteLine(i + j);        
    };
i = 3;

그렇다면 위의코드는 어떨까? 람다식이 i라는 외부변수를 참조하고있다.

이와 같이 외부변수를 참조하는 경우 클로저로 처리된다.

 

여기서 j가 1이라고 했을때 print를 실행하면 어떤값이 나올까?

4이다.

 

외부 변수나 필드와 같은 주변환경을 저장한다는건, 값이 아니라 변수 그 자체를 참조하여 저장한다는 의미이다.

i의 값을 복사해서 가져오는게 아니라 변수 i 그 자체를 참조해 버린다는 말이다.

 

for (int i =0; i < 5; i++)
{
	 Action<string> print = delegate ()
    {                
        Console.WriteLine(i);
    };
}

때문에 이렇한 코드는 i 가 마지막으로 바뀐 5의 값으로 모두 출력된다.

 

for (int i =0; i < 5; i++)
{
	int j = i;
	 Action<string> print = delegate ()
    {  
        Console.WriteLine(j);
    };
}

이렇게 j를 새로 할당하여 매번 새로운 값을 넣어준다면 원하는대로 작동시킬 수 있다.

반응형

'C#' 카테고리의 다른 글

[C#] 링크(LINQ) Take(), Skip()  (0) 2023.07.17
[C#] 링크(LINQ) 메서드식 표현  (0) 2023.07.17
[C#] Action, Predicate, Function  (0) 2022.11.15
[C#] 제네릭 형식 제약조건  (1) 2022.09.30
[c#] delegate 와 Event  (0) 2022.06.30