[UNITY] for문에서의 Action()과 클로저(closure)의 개념

2022. 10. 29. 10:51UNITY

for문에서의 Action

액션을 만들어두고 특정 이벤트가 발생했을때 실행되도록 하는 경우가 있다. 대표적인 예로 버튼클릭액션이다. 

만약 이때 어떤 변수를 넣어줘야 할 경우, 등록하는 순간의 값이 아니라 실제로 실행되는 순간에 변수가 들어간다. 

Slots[0].ClickAction(() => 
ShowNavigationPopup(type1, value1));

위처럼 확실한 값을 넣을 경우에는 문제가 생기지 않는다. 그런데 아래와 같은 경우에는 어떻게 될까?

for (int i = 0; i < rewardGroup.Count(); i++)
{
    Slots[i].SetRewardData(rewardGroup[i].type, rewardGroup[i].value);
    Slots[i].ClickAction(() => ShowNavigationPopup()); 
}

의도는 다음과 같을 것이다. 해당 _uiBattlePassRewardSlots[]에 reward_type과 reward_index값을 가진 클릭 액션이 발동되도록 하는것.

하지만 이렇게 할 경우 위험하다. i의 값이 가변이기 때문에 내가 원하는 값이 호출되거나 혹은 들어간다는 보장이 없다. 만약  i가 0,1,2 일때 어떤 특정 값을 넣었다고 가정해보고 i가 3일때 return 시켰다면 나중에 ClickAction이 불릴때 넣는 순간이 아닌 호출되는 시점인 i가 3이 되어 Slot[3]을 호출하게 된다.

따라서 각 데이터를 각자가 들고 있고, 해당 액션이 불릴때 들고 있는 값으로 호출해야한다. 

해당 개념에서 Closure이라는 단어가 등장한다.

 

Closure

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

for (int i = 0; i < rewardGroup.Count(); i++)
{
	int temp = i;
    Slots[temp].SetRewardData(rewardGroup[temp].type, rewardGroup[temp].value);
    Slots[temp].ClickAction(() => ShowNavigationPopup()); 
}

++