주녘공부일지

[C#] 람다식 클로저(Closure) 반복문 문제 본문

GameDevelopment/[Unity] Issue Memo

[C#] 람다식 클로저(Closure) 반복문 문제

주녘 2025. 1. 24. 17:25

클로저(Closure)란?

- 외부 함수의 변수를 내부 함수가 참조할 때 발생

- 이 경우, 메서드 레퍼런스로 외부 함수의 변수가 힙에 할당됨 ( 외부 변수 캡처 )

 

UniRx 테스트 중 겪은 예시)

for(int i = 0; i < btns.Length; i++)
{
    btns[i].OnClickAsObservable().Subscribe(_ => OnClickTest(i));
}

- OnClickTest 메서드는 for문에 있는 하나의 i를 참조하게 되어 i = btns.Length 값인 4가 들어가게 되는 것

 

for(int i = 0; i < btns.Length; i++)
{
    int index = i; // 로컬 변수로 i 값을 고정해야 함
    btns[i].OnClickAsObservable().Subscribe(_ => OnClickTest(index));
}

- index는 매번 새로 선언되어 값을 할당받기 때문에 해결 가능