viewimage.php?id=2abcdd23dad63db0&no=24b0d769e1d32ca73cec8efa11d02831ed3c848cabfee483347b0fb096a903c5b34415cdd7083be1e0ff5b01114848286d0714bed24ecf961d414b2d3494012f68c337ee


Button ์ปดํฌ๋„ŒํŠธ๋ฅผ ๊ฐ€์ง„ ์˜ค๋ธŒ์ ํŠธ ์—ฌ๋Ÿฌ ๊ฐœ์— ๊ฐ๊ฐ ๋ฉ”์†Œ๋“œ๋ฅผ ํ• ๋‹นํ•˜๊ณ  ์‹ถ์„๋•Œ


Button[] btns;

void Start() {
btns = GetComponentsInChildren<Button>();
for ( int i = 0; i < btns.Length; i++ ) {
btns[i].onClick.AddListener(()=> BtnClicked(i));
}
}


์œ„์ฒ˜๋Ÿผ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์งœ๋ฉด for ๋ฌธ์„ ๊ฑฐ์ณ i ๊ฐ€ 0๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด

btns[0] ์—๋Š” BtnClicked(0) ์ด ํ• ๋‹น๋˜๊ณ 

btns[1] ์—๋Š” BtnClicked(1) ์ด ํ• ๋‹น๋˜๊ณ 

...

btns[i] ์—๋Š” BtnClicked(i) ์ด ํ• ๋‹น๋ ๊ฑฐ๋ผ ์ƒ๊ฐํ•˜์ง€๋งŒ ์‹ค์ œ๋ก  ๊ทธ๋ ‡์ง€ ์•Š๋‹ค.


์‹ค์ œ๋กœ๋Š” ๋ชจ๋“  btns ์— BtnClicked(btns.Length+1) ์ด ํ• ๋‹น ๋˜๋ฉฐ ์ด๋Ÿฐ ๋ฌธ์ œ๋ฅผ Closure Problem ์ด๋ผ ํ•œ๋‹ค.

Closure ๋Š” ๋žŒ๋‹ค์‹(๋˜๋Š” ๋ฌด๋ช… ๋ฉ”์†Œ๋“œ)์ด ์ง€์—ญ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ํ•ด๋‹น ๋žŒ๋‹ค์‹์„ Closure ๋ผ๊ณ  ํ•˜๋ฉฐ,

Closure ๋Š” ์ง€์—ญ๋ณ€์ˆ˜์˜ ๊ฐ’์„ ๊ฐ€์ ธ์˜ค๋Š”๊ฒŒ ์•„๋‹Œ ์ง€์—ญ๋ณ€์ˆ˜ ์ž์ฒด๋ฅผ ์ฐธ์กฐํ•˜๊ธฐ ๋•Œ๋ฌธ์—

์ปดํŒŒ์ผ์ด ๋๋‚˜๊ณ  ๋‚˜์„œ์˜ ์ง€์—ญ๋ณ€์ˆ˜ ๊ฐ’์„ ๋ถˆ๋Ÿฌ์˜ค๊ฒŒ ๋œ๋‹ค.


for ๋ฌธ์˜ i๋Š” 0๋ถ€ํ„ฐ ์‹œ์ž‘๋˜์–ด btns.Length+1 ์— ๋„๋‹ฌํ•˜๋ฉด ๋ฐ˜๋ณต์„ ์ค‘์ง€ํ•˜๊ณ ย btns.Length+1์—์„œ ๋ฉˆ์ถ˜๋‹ค.

์ด ๋•Œ AddListener ๋Š” ํ•ด๋‹น ๋ฒ„ํŠผ์— BtnClicked(i), ์ฆ‰ BtnClicked(btns.Length+1)์„ ํ• ๋‹น์‹œํ‚จ๋‹ค.


๊ทธ๋Ÿฌ๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ์˜๋„๋Œ€๋กœ ํ˜๋Ÿฌ๊ฐˆ๊นŒ?


void Start() {
btns = GetComponentsInChildren<Button>();
for ( int i = 0; i < btns.Length; i++ ) {
int copy = i;
btns[copy].onClick.AddListener(()=> BtnClicked(copy));
}
}


๊ฐ„๋‹จํ•˜๊ฒŒ๋„ for๋ฌธ ๋‚ด๋ถ€์— ์ƒˆ๋กœ ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•˜๊ณ  i ๊ฐ’์„ ๋ฐ›์•„์ฃผ๋ฉด ๋œ๋‹ค.

AddListener๊ฐ€ ์ „๋‹ฌํ•˜๋Š” copy ๊ฐ’์€ for๋ฌธ์ด ๋ฐ˜๋ณตํ•  ๋•Œ๋งˆ๋‹ค ์ƒˆ๋กœ ์„ ์–ธ๋˜์–ด ํ•ด๋‹น ๊ฐ’์„ ์ „๋‹ฌํ•˜๊ธฐ ๋•Œ๋ฌธ์—

์˜๋„ํ•œ ๋Œ€๋กœ ํ˜๋Ÿฌ๊ฐ€๊ฒŒ ๋œ๋‹ค.


๋ชฐ๋ž์œผ๋ฉด ๊ฐœ์ถ”