[JS๐Ÿฃ] ํด๋กœ์ €(Closure)

๊น€๋‹ค์Šฌยท2021๋…„ 8์›” 4์ผ
0

Java Script ์™„์ „ ์ •๋ณต

๋ชฉ๋ก ๋ณด๊ธฐ
3/5

Introduction

์–ด์ œ ์˜ค๋Š˜ ๋‚˜๋ฅผ ๊ดด๋กญํ˜”๋˜ ํด๋กœ์ €...์ž ๋“ค๊ธฐ ์ „๊นŒ์ง€ ์˜ˆ์ œ๋ณด๊ณ  ๋…ธํŠธ์— ๊ทธ๋ ค๋ณด๊ณ  ํ•˜๋ฉด์„œ ์ดํ•ดํ•˜๋ ค๊ณ  ๋…ธ๋ ฅํ–ˆ๋˜ ๊ฒƒ ๊ฐ™๋‹ค.
์ด์ œ ์™„๋ฒฝํ•˜๊ฒŒ ๊ทธ๋ž˜๋„ ์กฐ๊ธˆ์€ ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ์„ ์ •๋„์˜ ์ดํ•ด๊ฐ€ ๋˜์–ด ํฌ์ŠคํŒ…์„ ํ•˜๊ณ ์žํ•œ๋‹ค.
์ด ๊ธ€์„ ๋ณด๊ธฐ ์ „์— ๋ ‰์‹œ์ปฌ ์Šค์ฝ”ํ”„ ์ดํ•ด ํ•„์ˆ˜ !!

ํด๋กœ์ €(Closure)๋ž€ ๋ฌด์—‡์ธ๊ฐ€?

ํด๋กœ์ €(Closure)

ํด๋กœ์ €์— ๋Œ€ํ•œ ์ •์˜๋ฅผ ๋จผ์ € ๋ณด์ž๋ฉด MDN์€ ์ด๋ ‡๊ฒŒ ์ •์˜ํ•œ๋‹ค.

ํด๋กœ์ €๋Š” ํ•จ์ˆ˜์™€ ๊ทธ ํ•จ์ˆ˜๊ฐ€ ์„ ์–ธ๋์„ ๋•Œ์˜ ๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝ๊ณผ์˜ ์กฐํ•ฉ์ด๋‹ค.

์ •์˜๋งŒ ๋ด์„œ๋Š” ์‚ฌ์‹ค ์ดํ•ด๊ฐ€ ๊ฐ€์ง€ ์•Š์•„์„œ, ๊ฐ„๋‹จํ•œ ์˜ˆ์ œ๋ฅผ ํ™•์ธํ•ด๋ณด์ž!

์œ„์™€ ๊ฐ™์€ ์ฝ”๋“œ์—์„œ ์‚ดํŽด๋ณด๋ฉด,
makeGreeting ํ•จ์ˆ˜๋Š” ๋‚ด๋ถ€ ํ•จ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฉด์„œ ์ข…๋ฃŒ๋˜์–ด call stack์—์„œ ์‚ฌ๋ผ์ง€๊ฒŒ ๋œ๋‹ค. ์ฆ‰, ๋ณ€์ˆ˜ greeting์— ์ ‘๊ทผํ•  ์ˆ˜ ์—†๊ฒŒ ๋˜์—ˆ๋‹ค.

ํ•˜์ง€๋งŒ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์‚ฌ๋ผ์กŒ์Œ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ ,
world์™€ daseul์€ greetig ๋ณ€์ˆ˜๋ฅผ ๊ธฐ์–ตํ•˜์—ฌ Hello, World!์™€ Hello, Daseul!์„ ์ถœ๋ ฅํ•˜๊ฒŒ ๋œ๋‹ค.

์ด์ฒ˜๋Ÿผ, ์ž์‹ ์„ ํฌํ•จํ•˜๊ณ  ์žˆ๋Š” ์™ธ๋ถ€ ํ•จ์ˆ˜๋ณด๋‹ค ๋‚ด๋ถ€ ํ•จ์ˆ˜๊ฐ€ ๋” ์˜ค๋ž˜ ์œ ์ง€๋˜๋Š” ๊ฒฝ์šฐ, ์™ธ๋ถ€ ํ•จ์ˆ˜ ๋ฐ–์—์„œ ๋‚ด๋ถ€ ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜๋”๋ผ๋„ ์™ธ๋ถ€ ํ•จ์ˆ˜์˜ ์ง€์—ญ ๋ณ€์ˆ˜์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด ๋ฐ”๋กœ ํด๋กœ์ €(Clousre)

ํด๋กœ์ €(Closure)์˜ ํ™œ์šฉ

๊ทธ๋ ‡๋‹ค๋ฉด, ํด๋กœ์ €๋ฅผ ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ผ๊นŒ?

์€๋‹‰ํ™”

ํด๋กœ์ €๋ฅผ ์ด์šฉํ•˜์—ฌ ๋‚ด๋ถ€ ๋ณ€์ˆ˜์™€ ํ•จ์ˆ˜๋ฅผ ์ˆจ๊ธธ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋ฅผ ์€๋‹‰ํ™”๋ผ๊ณ  ํ•œ๋‹ค. ์€๋‹‰ํ™”๋ฅผ ํ†ตํ•ด ์™ธ๋ถ€์—์„œ ๋ณ€์ˆ˜์— ์ ‘๊ทผํ•  ์ˆ˜ ์—†๋„๋ก ํ•œ๋‹ค.
์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ๋ชจ๋“  ๊ฐ์ฒด๋Š” ํ”„๋กœํผํ‹ฐ๋“ค์˜ ์™ธ๋ถ€ ์ ‘๊ทผ์ด ๋ชจ๋‘ ํ—ˆ์šฉ๋˜๊ธฐ ๋•Œ๋ฌธ์—, ํด๋กœ์ € ์™ธ์—๋Š” ์ฐจ๋‹จํ•  ๋ฐฉ๋ฒ•์ด ์—†๋‹ค.

์˜ˆ์‹œ ์ฝ”๋“œ

์œ„์˜ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด
์™ธ๋ถ€์—์„œ๋Š” privateCounter ๋ณ€์ˆ˜์— ์ ‘๊ทผํ•  ์ˆ˜ ์—†์œผ๋ฉฐ,
๋‚ด๋ถ€ ํ•จ์ˆ˜์ธ changBy ํ•จ์ˆ˜ ์—ญ์‹œ ์™ธ๋ถ€์—์„œ ์กฐ์ž‘ํ•  ์ˆ˜ ์—†๋‹ค.

๋”ฐ๋ผ์„œ ๋ฐ˜ํ™˜๋œ ํ•จ์ˆ˜์— ์˜ํ•ด์„œ๋งŒ, ๊ฐ’์˜ ์กฐ์ž‘์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
๊ฒฐ๊ณผ์ ์œผ๋กœ private ์†์„ฑ์„ ๋งŒ๋“  ๊ฒƒ์ด๋ผ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

์•Œ๊ธฐ ํž˜๋“  ๋ฒ„๊ทธ ์ˆ˜์ • (๋ฐ˜๋ณต๋ฌธ)

ํด๋กœ์ €(Closure)๋ฅผ ์ž˜ ์•ˆ๋‹ค๋ฉด ์•Œ๊ธฐ ํž˜๋“  ๋ฒ„๊ทธ ์ˆ˜์ •์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
์•„๋ž˜์˜ ๋ฐ˜๋ณต๋ฌธ ์˜ˆ์‹œ๋ฅผ ์‚ดํŽด๋ณด์ž !

์˜ˆ์‹œ ์ฝ”๋“œ

0, 1, 2, 3, 4๊ฐ€ ์ˆœ์ฐจ์ ์œผ๋กœ ์ถœ๋ ฅ๋  ๊ฒƒ์ด๋ผ ์˜ˆ์ƒํ–ˆ์ง€๋งŒ,
๊ฒฐ๊ณผ์ ์œผ๋กœ 5๊ฐ€ 5๋ฒˆ ์ถœ๋ ฅ๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

์ด๋Š” setTimeout์ด ํ˜ธ์ถœ๋˜์–ด Web API๋ฅผ ๊ฑฐ์ณ Task queue๋กœ ์ด๋™ํ•˜๋Š” ๋™์•ˆ, for loop๊ฐ€ 5๋ฒˆ ์‹คํ–‰๋˜์–ด ์ด๋ฏธ i๋Š” 5๊ฐ€ ๋˜์–ด์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
๋”ฐ๋ผ์„œ, ๋ชจ๋“  setTimeout์˜ callbackํ•จ์ˆ˜๊ฐ€ i๋ฅผ ์ฐธ์กฐํ•˜๋ฏ€๋กœ 5๊ฐ€ 5๋ฒˆ ์ถœ๋ ฅ๋˜๊ฒŒ ๋œ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด i๋ฅผ ์ˆœ์ฐจ์ ์œผ๋กœ ์ถœ๋ ฅ์‹œํ‚ค๊ณ  ์‹ถ๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผํ• ๊นŒ?

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ• 1 - IIFE(์ฆ‰์‹œ ์‹คํ–‰ ํ•จ์ˆ˜)

์ฒซ๋ฒˆ์งธ๋กœ๋Š” ์ฆ‰์‹œ ์‹คํ–‰ ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜์—ฌ ๋ฃจํ”„๋งˆ๋‹ค ํด๋กœ์ €๋ฅผ ๋งŒ๋“ค์–ด i๋ฅผ number๊ฐ’์— ๊ฐ๊ฐ ์ €์žฅํ•˜๋Š” ๋ฐฉ์‹์ด ์žˆ๋‹ค.
๋ฃจํ”„๋งˆ๋‹ค number๊ฐ’์ด ์ €์žฅ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ˆœ์ฐจ์ ์œผ๋กœ ๊ฐ’์„ ์ถœ๋ ฅํ•  ์ˆ˜ ์žˆ๋‹ค.

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ• 2 - let ์ด์šฉ

๋‹ค์Œ์œผ๋กœ๋Š”, for ๋ฃจํ”„ ๋‚ด๋ถ€์— let์„ ์„ ์–ธํ•˜์—ฌ ๋งค ๋ฃจํ”„๋งˆ๋‹ค ํด๋กœ์ €๋ฅผ ์ƒ์„ฑ์‹œํ‚ค๋Š” ๋ฐฉ์‹์ด๋‹ค. let์€ ๋ธ”๋ก ๋ ˆ๋ฒจ ์Šค์ฝ”ํ”„์ด๊ธฐ ๋•Œ๋ฌธ์— ๋งค๋ฒˆ ํด๋กœ์ €๋ฅผ ์ƒˆ๋กญ๊ฒŒ ์ƒ์„ฑํ•˜๊ฒŒ ๋œ๋‹ค.
๋”ฐ๋ผ์„œ setTimeout์˜ callback ํ•จ์ˆ˜๊ฐ€ ๊ฐ๊ฐ์˜ i๋ฅผ ์ฐธ์กฐํ•˜์—ฌ ์ˆœ์ฐจ์ ์œผ๋กœ ๊ฐ’์„ ์ถœ๋ ฅํ•  ์ˆ˜ ์žˆ๋‹ค.

Comment

ํด๋กœ์ €๋ฅผ ์ดํ•ดํ•˜๊ธฐ์œ„ํ•ด ์ •๋ง ๋งŽ์€ ๊ฒ€์ƒ‰๊ณผ ๊ณ ์ƒ์„ ํ–ˆ๋˜ ๊ฒƒ ๊ฐ™๋‹ค...
์•„์ง ์™„๋ฒฝํ•˜๊ฒŒ ์ดํ•ดํ–ˆ๋‹ค๊ณ ๋Š” ํ•  ์ˆ˜ ์—†์ง€๋งŒ, ๊ทธ๋ž˜๋„ ํด๋กœ์ €๊ฐ€ ์–ด๋–ค ๊ฐœ๋…์ด๊ณ  ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•˜๋Š”์ง€๋ฅผ ์•Œ๊ฒŒ ๋˜์—ˆ๋‹ค. ์ฝ”๋”ฉ์„ ํ•˜๋ฉด์„œ ๊ณ„์†ํ•ด์„œ ์ตํ˜€๋‚˜๊ฐ€์•ผ๊ฒ ๋‹ค.

์ฐธ๊ณ  ์‚ฌ์ดํŠธ

ํด๋กœ์ €์™€ ํด๋กœ์ € ์‚ฌ์šฉ ์˜ˆ์ œ
https://velog.io/@proshy/JS%ED%81%B4%EB%A1%9C%EC%A0%B8closure%EC%99%80-%ED%81%B4%EB%A1%9C%EC%A0%B8%EC%9D%98-%EC%82%AC%EC%9A%A9-%EC%98%88%EC%A0%9C
ํด๋กœ์ €
https://poiemaweb.com/js-closure
ํด๋กœ์ €
https://sungjk.github.io/2016/10/03/Closure.html

profile
์ธ์ƒ์€ ์šฉ๊ธฐ์˜ ์–‘์— ๋”ฐ๋ผ ์ค„์–ด๋“ค๊ฑฐ๋‚˜, ๋Š˜์–ด๋‚œ๋‹ค

0๊ฐœ์˜ ๋Œ“๊ธ€