JS Closure
Table of contents
์๋ฐ์คํฌ๋ฆฝํธ์ ํด๋ก์ (Closure)
ํด๋ก์ (closure)๋ ์ธ๋ถ ๋ณ์๋ฅผ ๊ธฐ์ตํ๊ณ ์ด ์ธ๋ถ ๋ณ์์ ์ ๊ทผํ ์ ์๋ ํจ์, ํจ์๊ฐ ์ ์ธ๋ ๋์ ํ๊ฒฝ์ ๊ธฐ์ตํ์๋ค๊ฐ ์์ ์ด ์ ์ธ ๋์์ ๋์ ํ๊ฒฝ์ด ์๋ ๊ณณ์์ ํธ์ถ๋์ด๋ ์์ ์ด ์ ์ธ๋ ํ๊ฒฝ์ ์ ๊ทผํ ์ ์๋ ํจ์๋ฅผ ์๋ฏธํ๋ค.
ํจ์๋ ์์ ์ด ์ ์๋ ํ๊ฒฝ์ ๊ธฐ์ตํ๋ค
์๋ฐ์คํฌ๋ฆฝํธ์ ๋ชจ๋ ํจ์๋ ์์ ์ ๋ด๋ถ ์ฌ๋กฏ [[Environment]]
์ '์์ ์ด ์ ์๋ ํ๊ฒฝ์ ์ฐธ์กฐ'๋ฅผ ์ ์ฅํ๋ค.
[[Environment]]
์ ์ ์ฅ๋๋ '์์ ์ด ์ ์๋ ํ๊ฒฝ์ ์ฐธ์กฐ'๋ ํจ์ ์ ์๊ฐ ํ๊ฐ๋์ด 'ํจ์ ๊ฐ์ฒด๊ฐ ์์ฑ๋ ๋์ ๋ ์์ปฌ ํ๊ฒฝ'์ด๋ค.
์์ ์ด ์ ์๋ ํ๊ฒฝ = ํจ์ ๊ฐ์ฒด๊ฐ ์์ฑ๋ ๋์ ๋ ์์ปฌ ํ๊ฒฝ
'ํจ์ ๊ฐ์ฒด๊ฐ ์์ฑ๋ ๋์ ๋ ์์ปฌ ํ๊ฒฝ'์ '์์ฑ๋๋ ํจ์ ๊ฐ์ฒด์ ์ธ๋ถ ๋ ์์ปฌ ํ๊ฒฝ'์ด๊ณ , ๋ค๋ฅด๊ฒ ํํํ๋ฉด '์์ ์ ์์ ์ค์ฝํ'๋ผ ํ ์ ์๋ค.
ํจ์ ๊ฐ์ฒด๊ฐ ์์ฑ๋ ๋์ ๋ ์์ปฌ ํ๊ฒฝ = ์์ฑ๋๋ ํจ์ ๊ฐ์ฒด์ ์ธ๋ถ ๋ ์์ปฌ ํ๊ฒฝ = ์์ ์ ์์ ์ค์ฝํ
๊ฐ๋จํ๊ฒ ์์ฝํ๋ฉด ํจ์์ ๋ด๋ถ ์ฌ๋กฏ [[Environment]]
์๋ '์์ ์ค์ฝํ์ ์ฐธ์กฐ'๋ฅผ ์ ์ฅํ๋ค๊ณ ํ ์ ์๋ค.
์์ ์ด ์ ์๋ ํ๊ฒฝ์ ์ฐธ์กฐ = ์์ ์ค์ฝํ์ ์ฐธ์กฐ
ํจ์๋ ์์ ์ด ์กด์ฌํ๋ ํ ๋ด๋ถ ์ฌ๋กฏ [[Environment]]์ ๋ ์์ปฌ ํ๊ฒฝ์ ์ฐธ์กฐ๋ฅผ ์ ์ฅํ๊ณ ์๋ค.
์ธ๋ถ ํจ์ ๋ณด๋ค ์ค์ฒฉ ํจ์์ ์๋ช ์ฃผ๊ธฐ๊ฐ ๊ธธ๋ค
์ค์ฒฉ ํจ์๋ฅผ ํฌํจํ๊ณ ์๋ ์ธ๋ถ ํจ์ ๋ณด๋ค ์ค์ฒฉ ํจ์์ ์๋ช ์ฃผ๊ธฐ๊ฐ ๋ ๊ธธ๋ฉด ์ธ๋ถ ํจ์ ๋ฐ์์ ์ค์ฒฉ ํจ์๋ฅผ ํธ์ถํด๋ ์ธ๋ถ ํจ์์ ์ง์ญ ๋ณ์์ ์ ๊ทผํ ์ ์๋ค.
function outer() {const x = 10;const inner = function () { console.log(x); };return inner;}const innerFunc = outer();innerFunc();
์ธ๋ถ ํจ์์ ์คํ์ด ์ข ๋ฃ๋๋ฉด์ ์ค์ฒฉ ํจ์๋ฅผ ๋ฐํํ๊ณ ์ธ๋ถ ํจ์์ ์๋ช ์ฃผ๊ธฐ๋ ์ข ๋ฃ๋๊ณ ์ธ๋ถ ํจ์์ ์คํ ์ปจํ ์คํธ๊ฐ ์คํ ์ปจํ ์คํธ ์คํ์์ ์ ๊ฑฐ๋๋ค.
์ธ๋ถ ํจ์์ ๋ ์์ปฌ ํ๊ฒฝ์ ์ค์ฒฉ ํจ์์ [[Environment]]
๋ด๋ถ ์ฌ๋กฏ์ ์ํด ์ฐธ์กฐ๋๊ณ ์๊ณ ์ค์ฒฉ ํจ์๋ ์ ์ญ ๋ณ์์ ์ํด ์ฐธ์กฐ๋๊ณ ์์ผ๋ฏ๋ก ๊ฐ๋น์ง ์ปฌ๋ ์
์ ๋์์ด ๋์ง ์๊ธฐ ๋๋ฌธ์ ์ธ๋ถ ํจ์์ ์คํ ์ปจํ
์คํธ๊ฐ ์คํ ์ปจํ
์คํธ ์คํ์ด ์ ๊ฑฐ๋์ง๋ง ์ธ๋ถ ํจ์์ ๋ ์์ปฌ ํ๊ฒฝ์ ์๋ฉธ๋์ง ์๋๋ค.
๋ฐํ๋ ์ค์ฒฉ ํจ์๋ฅผ ํธ์ถํ๋ฉด ์ค์ฒฉ ํจ์์ ์คํ ์ปจํ
์คํธ๊ฐ ์์ฑ๋๋ฉด์ ๋ ์์ปฌ ํ๊ฒฝ์ ๋ํ ์ฐธ์กฐ๋ ์ค์ฒฉ ํจ์ ๊ฐ์ฒด์ ๋ด๋ถ ์ฌ๋กฏ [[Environment]]
์ ์ ์ฅ๋์ด ์๋ ์ฐธ์กฐ ๊ฐ์ ํ ๋นํ๊ณ , ์คํ ์ปจํ
์คํธ ์คํ์ push๋๋ค.
์ค์ฒฉ ํจ์๋ ์ธ๋ถ ํจ์๊ฐ ์คํ ์ปจํ ์คํธ์์ ์ ๊ฑฐ๋ ๊ฒ๊ณผ ์๊ด์์ด ์์ ์ด ์ ์๋ ์์น์ ์ํด ๊ฒฐ์ ๋ ์์ ์ค์ฝํ๋ฅผ ๊ธฐ์ตํ๊ณ ์์ผ๋ฏ๋ก ์์ ์ค์ฝํ์ ์๋ณ์๋ฅผ ์ฐธ์กฐํ ์ ์๊ณ ์๋ณ์์ ๊ฐ์ ๋ณ๊ฒฝํ ์๋ ์๋ค.
- ์ธ๋ถ ํจ์์ ์คํ ์ข ๋ฃ๋๋ฉด์ ์ค์ฒฉ ํจ์ ๋ฐํ
- ์ด๋, ๋ฐํ๋ ์ค์ฒฉ ํจ์๋ ์ธ๋ถ(์ ์ญ) ๋ณ์์ ์ํด ์ฐธ์กฐ ๋๊ณ ์๋ค.
- ์คํ ์ปจํ ์คํธ ์คํ์์ ์ธ๋ถ ํจ์์ ์คํ ์ปจํ ์คํธ ์ ๊ฑฐ
- ๋ฐํ๋ ์ค์ฒฉ ํจ์๊ฐ ์ธ๋ถ ํจ์๋ฅผ ์ฐธ์กฐํ๊ณ ์๊ธฐ ๋๋ฌธ์ ์ธ๋ถ ํจ์์ ๋ ์์ปฌ ํ๊ฒฝ์ ์ฌ๋ผ์ง์ง ์๋๋ค.
- ๋ฐํ๋ ์ค์ฒฉ ํจ์ ํธ์ถ
- ์ค์ฒฉ ํจ์์ ์คํ ์ปจํ ์คํธ ์์ฑ
- ์คํ ์ปจํ ์คํธ ์คํ์ push
- ๋ ์์ปฌ ํ๊ฒฝ์ ๋ํ ์ฐธ์กฐ๋ ์ค์ฒฉ ํจ์์ ๋ด๋ถ ์ฌ๋กฏ
[[Environment]]
์ ์ ์ฅ๋์ด ์๋ ์ฐธ์กฐ ๊ฐ์ด ํ ๋น๋๋ค.
์ค์ฒฉ ํจ์๊ฐ ์ธ๋ถ ํจ์๋ณด๋ค ๋ ์ค๋ ์ ์ง๋์ด์ผ ์์ ์ค์ฝํ์ ์๋ณ์๋ฅผ ์ฐธ์กฐํ ์ ์๋ค.
์ค์ฒฉ ํจ์๊ฐ ์์ ์ค์ฝํ์ ์๋ณ์๋ฅผ ์ฐธ์กฐํ๊ณ ์์ด์ผ ํ๋ค
์๋ฐ์คํฌ๋ฆฝํธ์ ๋ชจ๋ ํจ์๋ ์์ ์ ์์ ์ค์ฝํ๋ฅผ ๊ธฐ์ตํ๊ธฐ ๋๋ฌธ์ ํจ์๋ฅผ ํธ์ถํ๋ ๊ณณ์ ์๊ด์์ด ์ธ์ ๋ ์์ ์ด ๊ธฐ์ตํ๋ ์์ ์ค์ฝํ์ ์๋ณ์๋ฅผ ์ฐธ์กฐํ ์ ์์ผ๋ฉฐ ์๋ณ์์ ๋ฐ์ธ๋ฉ ๋ ๊ฐ์ ๋ณ๊ฒฝํ ์๋ ์๋ค.
ํ์ง๋ง ๋๋ถ๋ถ์ ๋ชจ๋ ๋ธ๋ผ์ฐ์ ๋ ์ต์ ํ๊ฐ ๋์ด์์ด ์์ ์ค์ฝํ์ ๋ชจ๋ ์๋ณ์๋ฅผ ๊ธฐ์ตํ์ง ์๊ณ ํด๋ก์ ๊ฐ ์ฐธ์กฐํ๊ณ ์๋ ์๋ณ์๋ง์ ๊ธฐ์ตํ๋ฉฐ, ์ค์ฒฉ ํจ์๊ฐ ์์ ์ค์ฝํ์ ์ด๋ค ์๋ณ์๋ ์ฐธ์กฐํ์ง ์๋๋ค๋ฉด ์์ ์ค์ฝํ๋ฅผ ๊ธฐ์ตํ์ง ์๋๋ค. ์ด๋ ๊ฒ ํด๋ก์ ์ ์ํด ์ฐธ์กฐ๋๋ ์์ ์ค์ฝํ์ ๋ณ์๋ฅผ ์์ ๋ณ์(free variable)๋ผ ํ๋ค.
์ค์ฒฉ ํจ์๊ฐ ์๋ณ์๋ฅผ ์ฐธ์กฐํ ์ ์๊ณ ์๋ณ์์ ๋ฐ์ธ๋ฉ ๋ ๊ฐ์ ๋ณ๊ฒฝํ ์ ์์ด์ผ ํด๋ก์ ๋ผ ํ ์ ์๋ค.
ํด๋ก์ ์ ์กฐ๊ฑด
์๋ฐ์คํฌ๋ฆฝํธ์ ํจ์๋ ๋ด๋ถ ์ฌ๋กฏ [[Environment]]
์ ์์ ์ด ์ ์๋ ํ๊ฒฝ์ ๊ธฐ์ตํ๊ณ ์๊ธฐ ๋๋ฌธ์ ์ด๋ก ์ ์ผ๋ก ๋ชจ๋ ํจ์๋ ํด๋ก์ ์ด์ง๋ง ์ค์ฒฉ ํจ์๊ฐ ์์ ์ค์ฝํ์ ์๋ณ์๋ฅผ ์ฐธ์กฐํ๊ณ ์๊ณ ์ค์ฒฉ ํจ์๊ฐ ์ธ๋ถ ํจ์๋ณด๋ค ๋ ์ค๋ ์ ์ง๋๋ ๊ฒฝ์ฐ์ ํ์ ํ๋ ๊ฒ์ด ์ผ๋ฐ์ ์ด๋ค.
- ์ค์ฒฉ ํจ์๋ ์์ ์ค์ฝํ๋ฅผ ๊ธฐ์ต(์ ์ฅ)ํ๊ณ ์์ด์ผ ํ๋ค.
- ์ธ๋ถ ํจ์ ๋ณด๋ค ์ค์ฒฉ ํจ์์ ์๋ช ์ฃผ๊ธฐ๊ฐ ๊ธธ์ด์ผ ํ๋ค.
- ์ค์ฒฉ ํจ์๊ฐ ์์ ์ค์ฝํ์ ์๋ณ์๋ฅผ ์ฐธ์กฐํ๊ณ ์์ด์ผ ํ๋ค.
ํด๋ก์ ์ ํ์ฉ
ํด๋ก์ ๋ฅผ ํ์ฉํ๋ฉด ์ํ๋ฅผ ์์ ํ๊ฒ ๋ณ๊ฒฝํ๊ณ ์ ์งํ๊ธฐ ์ํด ์ฌ์ฉ ํ์ง๋ง ์๋ชป ์ฌ์ฉํ ์ ๋ฉ๋ชจ๋ฆฌ ๋ฌธ์ ๊ฐ ์๊ธธ์ ์๋ค.
๋ณ์ ๊ฐ์ ๋๊ตฐ๊ฐ์ ์ํด ์ธ์ ๋ ์ง ๋ณ๊ฒฝ๋ ์ ์์ด ์ค๋ฅ ๋ฐ์์ ๊ทผ๋ณธ์ ์์ธ์ด ๋ ์ ์๊ธฐ ๋๋ฌธ์ ์ํ(state)๊ฐ ์๋์น ์๊ฒ ๋ณ๊ฒฝ๋์ง ์๋๋ก ์์ ํ๊ฒ ์๋(information hiding)ํ๊ณ ํน์ ํจ์์๊ฒ๋ง ์ํ ๋ณ๊ฒฝ์ ํ์ฉํ์ฌ ์ํ๋ฅผ ์์ ํ๊ฒ ๋ณ๊ฒฝํ๊ณ ์ ์งํ ์ ์๋ค.
ํนํ ์ํ ๋ณ๊ฒฝ์ด๋ ๊ฐ๋ณ(mutable) ๋ฐ์ดํฐ๋ฅผ ํผํ๊ณ ๋ถ๋ณ์ฑ(Immutability)์ ์งํฅ ํ๋ ํจ์ํ ํ๋ก๊ทธ๋๋ฐ์์ ๋ถ์ ํจ๊ณผ(Side effect)๋ฅผ ์ต๋ํ ์ต์ ํ์ฌ ์ค๋ฅ๋ฅผ ํผํ๊ณ ํ๋ก๊ทธ๋จ์ ์์ ์ฑ์ ๋์ด๊ธฐ ์ํด ํด๋ก์ ๋ ์ ๊ทน์ ์ผ๋ก ์ฌ์ฉ๋๋ค.
- ์ํ ์ ์ง
- ์ ๋ณด์ ์๋
- ์ ์ญ ๋ณ์์ ์ฌ์ฉ ์ต์
์บก์ํ
์บก์ํ(encapsulation)๋ ์ ๋ณด์ ์ผ๋ถ๋ฅผ ์ธ๋ถ์ ๊ฐ์ถ์ด ์๋(information hiding)ํ๋ ๊ฒ์ ๋งํ๋ค.
์ธ๋ถ์ ๊ณต๊ฐํ ํ์๊ฐ ์๋ ๊ตฌํ์ ์ผ๋ถ๋ฅผ ์ธ๋ถ์ ๊ณต๊ฐ๋์ง ์๋๋ก ๊ฐ์ถ์ด ์ ์ ์น ๋ชปํ ์ ๊ทผ์ผ๋ก๋ถํฐ ์ ๋ณด๋ฅผ ๋ณดํธํ๊ณ ๊ฐ์ฒด ๊ฐ์ ์ํธ ์์กด์ฑ(๊ฒฐํฉ๋)๋ฅผ ๋ฎ์ถ์ ์๋ค.
์๋ฐ์คํฌ๋ฆฝํธ ๊ฐ์ฒด์ ๋ชจ๋ ํ๋กํผํฐ์ ๋ฉ์๋๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ธ๋ถ์ ๊ณต๊ฐ๋์ด ์์ด ๊ธฐ๋ณธ์ ์ผ๋ก publicํ๋ค.
์๋ฐ์คํฌ๋ฆฝํธ๋ ์บก์ํ๋ฅผ ์์ ํ๊ฒ ์ง์ํ์ง ์๋๋ค.
์ธ์คํด์ค ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ค๋ฉด ์์ ๋ณ์๋ฅผ ํตํด private๋ฅผ ํ๋ด ๋ผ ์๋ ์์ง๋ง ํ๋กํ ํ์ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ฉด ์ด๋ง์ ๋ ๋ถ๊ฐ๋ฅํด์ง๋ค. ES6์ Symbol ๋๋ WeakMap์ ์ฌ์ฉํ์ฌ privateํ ํ๋กํผํฐ๋ฅผ ํ๋ด ๋ด๊ธฐ๋ ํ์ผ๋ ๊ทผ๋ณธ์ ์ธ ํด๊ฒฐ์ฑ ์ด ๋์ง๋ ์๋๋ค.
TC39 stage 3, ํด๋์ค์ private ํ๋๋ฅผ ์ ์ํ ์ ์๋ ์๋ก์ด ํ์ค ์ฌ์์ด ์ ์๋์ด ์๋ค.
์ ๋ฆฌ
ํด๋ก์ ๋ ๋ฐํ๋ ์ค์ฒฉ ํจ์๊ฐ ์์ ์ด ์ ์ธ ๋์์ ๋์ ๋ ์์ปฌ ํ๊ฒฝ(์์ ์ค์ฝํ)์ ์ค์ฒฉ ํจ์ ์์ ์ ๋ด๋ถ ์ฌ๋กฏ [[Environment]]
์ ์ ์ฅํ๊ณ ๊ธฐ์ตํ์ฌ, ์์ ์ด ์ ์ธ ๋์์ ๋์ ํ๊ฒฝ์ด ์๋ ๊ณณ์์ ํธ์ถ๋์ด๋ ๊ทธ ํ๊ฒฝ์ ์ ๊ทผํ ์ ์๋ ํจ์์ด๋ค.
- ํธ์ถ๋ ๊ณณ์ ์๊ด์์ด ์์ ์ด ๊ธฐ์ตํ๊ณ ์๋ ํ๊ฒฝ์ ์๋ณ์๋ฅผ ์ฐธ์กฐํ ์ ์๋ ํจ์
- ์ธ๋ถ ํจ์์ ์๋ช ์ฃผ๊ธฐ๊ฐ ๋ง๊ฐ๋๊ณ ์คํ ์ปจํ ์คํธ ์คํ์์ ์ ๊ฑฐ ๋์ด๋ ์ฐธ์กฐํ ์ ์๋ค.