반응형
클로저(Closure)란, 외부 변수나 필드와 같은 '환경'을 저장하고 있는 함수이다.
나는 클로저란 개념에 대해 for문에 람다식을 적용해버린 실수덕분에 알게되었다.
람다식은 작성된 외부의 변수나 필드를 사용해 함수를 실행시키게 된다.
for문의 경우
for(int i =0; i<LocationBtns.Count; i++)
{
Button locationBtn = LocationBtns[i];
locationBtn.onClick.AddListener(() =>
{
OnClickLocationBtn(i);
});
}
해당 코드와 같이 람다식이 외부의 변수 i를 참조하고 있다. 예를들어 LocationBtns의 Count가 4가 될때 for문이 끝날경우
i는 5가 되므로 람다식에 의해 OnClickLoactionBtn(i)이 실행될때 i는 무조건 5가 들어가게 된다.
이를 해결하려면 어떻게 해야할까?
for(int i =0; i<LocationBtns.Count; i++)
{
int index = i;
Button locationBtn = LocationBtns[i];
locationBtn.onClick.AddListener(() =>
{
OnClickLocationBtn(index);
});
}
index라는 새로운 지역변수를 선언하는 것이다. 이는 독립적으로 int값을 저장하므로 i처럼 외부의 변수로 취급되지 않는다.
반응형
'C#' 카테고리의 다른 글
라이브러리(Library)란? (0) | 2023.10.11 |
---|---|
C# : 백준 <바이러스> (0) | 2023.06.02 |
C# : 백준 <유기농 배추> (0) | 2023.06.01 |
C# : 백준 <택시 기하학> (0) | 2022.08.11 |
C# : 백준 <5의 수난> (0) | 2022.07.21 |