
10๋ถ ๋ง์ ์ดํดํ๋ ์๋ฐ์คํฌ๋ฆฝํธ โํด๋ก์ (Closure)โ
10๋ถ ๋ง์ ์ดํดํ๋ ์๋ฐ์คํฌ๋ฆฝํธ โํด๋ก์ (Closure)โ ๊ด๋ จ
ํด๋ก์ (Closure)๋ ์๋ฐ์คํฌ๋ฆฝํธ์ ํต์ฌ ๊ฐ๋ ์ค ํ๋์ด์ง๋ง, ๊ฐ๋ฐ์๋ค์ด ํํ ์ด๋ ต๊ฒ ๋๋ผ๋ ๊ฐ๋ ์ด๊ธฐ๋ ํฉ๋๋ค. ๊ณต์ ๋ฌธ์๋ ์ฑ ์ ๋ด๋ โํด๋ก์ ๋ ํจ์์ ๋ ์์ปฌ ํ๊ฒฝ์ ์กฐํฉ์ ๋๋คโ์ ๊ฐ์ ๋ฌธ์ฅ์ด ๋์ค๋๋ฐ, ๋ฐ๋ก ์ดํด๊ฐ ๋์ง ์์ ๋จธ๋ฆฌ๊ฐ ์ํ์ค๊ธฐ๋ ํ์ฃ . ํ์ง๋ง ์ฌ์ค ํด๋ก์ ๋ ์ดํดํ๊ธฐ ์ฌ์ด ๊ฐ๋ ์ค ํ๋์ ๋๋ค. ๋จ์ง ์ค๋ช ์ด ์ด๋ ต๊ฒ ๋๊ปด์ก์ ๋ฟ์ด์ฃ .
์ด๋ฒ ๊ธ์์๋ ํด๋ก์ ์ ์ ํํ ์ ์๋ถํฐ ์์ ์ฝ๋๋ฅผ ํตํ ๊ตฌ์ฒด์ ์ธ ๋ถ์๊น์ง ํ๋์ฉ ์ฒ์ฒํ ํ์ด์ ์๋ ค๋๋ฆฌ๊ฒ ์ต๋๋ค. ๋จ, ํด๋ก์ ๋ฅผ ์ดํดํ๋ ค๋ฉด ์คํ ์ปจํ ์คํธ์ ๋ ์์ปฌ ํ๊ฒฝ์ด๋ผ๋ ๊ฐ๋ ์ด ์ค์ํ๋ฐ์. ํน์ ์คํ ์ปจํ ์คํธ๋ผ๋ ๊ฐ๋ ์ด ๋ฏ์ค๋ค๋ฉด, ์ด์ ๊ธ โ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๋ ์ด๋ป๊ฒ ์คํ๋ ๊น?โ๋ฅผ ๋จผ์ ์ฝ๊ณ ์ค์๋ฉด ์ข์ต๋๋ค.
ํด๋ก์ ๋?
ํด๋ก์ ์ ์ ์๋ฅผ ์ธํฐ๋ท์ ๊ฒ์ํด ๋ณด๋ฉด, ๋ค์๊ณผ ๊ฐ์ ์ค๋ช ์ด ๋์ต๋๋ค.
โํด๋ก์ ๋ ์ฃผ๋ณ ์ํ์ ๋ํ ์ฐธ์กฐ์ ํจ๊ป ๋ฌถ์ธ ํจ์์ ์กฐํฉ์ ๋๋ค. ์ฆ, ํด๋ก์ ๋ ๋ด๋ถ ํจ์์์ ์ธ๋ถ ํจ์์ ๋ฒ์์ ๋ํ ์ ๊ทผ์ ์ ๊ณตํฉ๋๋ค.โ
1. ํด๋ก์ ์ ์ ์
์ฌ์ค ์ด๋ฐ ์ค๋ช ์ ์ฒ์ ์ ํ๋ฉด ๋๋ถ๋ถ ํผ๋์ค๋ฌ์ธ ๊ฒ ๊ฐ์๋ฐ์, โ์ฃผ๋ณ ์ํโ, โ์ฐธ์กฐโ, โ๋ฒ์์ ๋ํ ์ ๊ทผโ๊ณผ ๊ฐ์ ์ฉ์ด๋ค์ ๋ง์น ์ํ์ด๋ ์ฒ ํ์ฑ ์์ ๋์ค๋ ์ด๋ ค์ด ๋ง๋ค์ฒ๋ผ ๋ค๋ฆฌ๊ธฐ๋ ํฉ๋๋ค. ์ด๋ ๊ฒ ๋ณต์กํ๊ฒ ๋๊ปด์ง๋ ์ด์ ๋, ํด๋ก์ ๋ฅผ ํ ๋ฒ์ ๋๋ฌด ๋ง์ ๊ฐ๋ ์ ๋ด์ ์ค๋ช ํ๋ ค๊ณ ํ๊ธฐ ๋๋ฌธ์ ๋๋ค.
ํ์ง๋ง ํด๋ก์ ๋ ์ฌ์ค ๋งค์ฐ ์ง๊ด์ ์ด๊ณ ๊ฐ๋จํ ๊ฐ๋ ์ ๋๋ค. ๋ด๋ถ ํจ์๊ฐ ์์ ์ด ์ ์ธ๋ ํ๊ฒฝ, ์ฆ ์ธ๋ถ ํจ์์ ๋ณ์๋ ์ํ๋ฅผ ๊ธฐ์ตํ๊ณ ์๋ค๊ฐ, ๋์ค์ ๊ทธ ํ๊ฒฝ์ ๊ณ์ ์ ๊ทผํ๊ณ ์ฌ์ฉํ ์ ์๋ค๋ ๊ฒ์ด ํต์ฌ ๊ฐ๋ ์ธ๋ฐ์. ์ด ๊ธ์ ๋๊น์ง ์ฝ๊ณ ๋๋ฉด, ์์ ๋ณต์กํ ๊ณต์ ๊ฐ์ ์ ์๊ฐ ์ผ๋ง๋ ์ฝ๊ณ ๊ฐ๋จํ ๊ฐ๋ ์ ์ด๋ ต๊ฒ ํํํ ๊ฒ์ธ์ง ๊นจ๋ซ๊ฒ ๋ ๊ฒ์ ๋๋ค.
2. ์์ ์ฝ๋ ๋ถ์
๊ทธ๋ ๋ค๋ฉด, ๋ค์ ์์ ์ฝ๋๋ฅผ ํตํด ํด๋ก์ ๊ฐ ์ด๋ป๊ฒ ์๋ํ๋์ง ํ๋์ฉ ์์ธํ๊ฒ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
function outer() {
let count = 0;
return function() {
count++;
console.log(count);
};
}
const counter = outer();
counter(); // 1
counter(); // 2
</์ฝ๋>
์์ ์ฝ๋์์ ๋ฌด์จ ์ผ์ด ์ผ์ด๋๋์ง ์ฐจ๊ทผ์ฐจ๊ทผ ๋ถ์ํด ๋ณผ๊ฒ์. ๋จผ์ outer
๋ผ๋ ์ธ๋ถ ํจ์๊ฐ ์ ์๋์ด ์์ต๋๋ค. ์ด ํจ์ ์์๋ count
๋ผ๋ ๋ณ์๊ฐ ์กด์ฌํฉ๋๋ค. outer
ํจ์๋ ์ต๋ช
ํจ์๋ฅผ ๋ฐํํ๊ณ , ์ด ๋ด๋ถ ํจ์์์๋ ์ธ๋ถ์ ์ ์๋ ๋ณ์ count
๋ฅผ ์ฌ์ฉํด ๊ฐ์ ์ฆ๊ฐ์ํค๊ณ , ์ฆ๊ฐ๋ ๊ฐ์ ์ถ๋ ฅํฉ๋๋ค.
์ด์ outer()
ํจ์๋ฅผ ํธ์ถํ๋ฉด, ๋ฐํ๋ ๋ด๋ถ ํจ์๋ฅผ counter
๋ผ๋ ๋ณ์์ ์ ์ฅํฉ๋๋ค. ์ด๋ ๋จ์ํ๊ฒ ์๊ฐํด ๋ณด๋ฉด, ์ด๋ฏธ outer
ํจ์์ ์คํ์ด ์ข
๋ฃ๋์๊ธฐ ๋๋ฌธ์ outer
ํจ์ ๋ด๋ถ์ count
๋ณ์ ๋ํ ์ฌ๋ผ์ก๋ค๊ณ ์๊ฐํ๊ฒ ๋๋๋ฐ์. ๋ด๋ถ ํจ์๋ โํด๋ก์ โ์ ํน์ฑ ๋๋ถ์ ์ธ๋ถ ํจ์์ ํ๊ฒฝ์ ๊ธฐ์ตํ๊ณ ์์ต๋๋ค. ์ฆ, ๋ด๋ถ ํจ์๊ฐ ์ฌ์ ํ count
๋ณ์๋ฅผ ์ฐธ์กฐํ๊ณ ์๋ ๊ฒ์
๋๋ค.
๋ฐ๋ผ์ ์ดํ์ counter()
๋ฅผ ํธ์ถํ ๋๋ง๋ค, ๋ด๋ถ ํจ์๋ ์ฌ์ ํ ์ด์์๋ count
๋ณ์๋ฅผ ์ฐพ์ ๊ฐ์ ์ฆ๊ฐ์ํค๊ณ ์ถ๋ ฅํ ์ ์๊ฒ ๋ฉ๋๋ค. ์ด์ฒ๋ผ ๋ด๋ถ ํจ์๊ฐ ์ธ๋ถ ํจ์์ ํ๊ฒฝ์ ๊ธฐ์ตํ๋ ๋ฅ๋ ฅ์ด ํด๋ก์ ์ ํต์ฌ์ ์ธ ์๋ฆฌ์
๋๋ค. ๋๋ถ์ ์ธ๋ถ ํจ์๊ฐ ์ข
๋ฃ๋ ์ดํ์๋, ๊ทธ ๋ด๋ถ ์ํ(๋ณ์)์ ์ง์์ ์ผ๋ก ์ ๊ทผํ๊ณ ๊ด๋ฆฌํ ์ ์์ต๋๋ค.
๊ทธ๋ฆผ์ผ๋ก ์ดํดํ๋ฉด ์กฐ๊ธ ๋ ์ฝ๊ฒ ์ดํดํ ์ ์๋๋ฐ์. outer
ํจ์ ์คํ ์ปจํ
์คํธ๊ฐ ์์ฑ๋์์ ๋, ์ฝ์คํ ๋ด๋ถ๋ฅผ ๊ทธ๋ฆผ์ผ๋ก ๋ํ๋ด ๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.

outer
ํจ์ ์คํ ์ปจํ
์คํธ ๋ด๋ถ์์๋ ์ง์ญ ๋ณ์์ธ count๊ฐ ์ ์ธ๋๊ณ 0์ผ๋ก ์ด๊ธฐํ๋๋ฉฐ, ํจ์ ๋ด๋ถ์ ์ต๋ช
ํจ์๊ฐ ๋ฐํ๋ฉ๋๋ค. ์ฌ๊ธฐ์ ๋ฐํ๋ ์ต๋ช
ํจ์๋ counter
๋ณ์์ ์ ์ฅ๋๋ฉด์, ์ธ๋ถ์ count
๋ณ์(์ธ๋ถ ๋ ์์ปฌ ํ๊ฒฝ)๋ฅผ ํด๋ก์ ๋ก ์ ์งํ๊ฒ ๋ฉ๋๋ค.
๊ทธ๋ค์, outer
ํจ์๊ฐ ์ข
๋ฃ๋์ด outer
ํจ์ ์คํ ์ปจํ
์คํธ๊ฐ ์ข
๋ฃ๋ ์ดํ counter()
์ฝ๋๊ฐ ์คํ๋๋ฉด, counter
๋ณ์์๋ ์๊น ๋ฐํ๋ ์ต๋ช
ํจ์๊ฐ ์ ์ฅ๋์ด ์๊ธฐ ๋๋ฌธ์ ๋ค์ ์ต๋ช
ํจ์๊ฐ ํธ์ถ๋์ด, ์ต๋ช
ํจ์ ์คํ ์ปจํ
์คํธ๊ฐ ์์ฑ๋ฉ๋๋ค. ๊ทธ๋ฆผ์ผ๋ก ๋ํ๋ด๋ฉด ์๋์ ๊ฐ์ต๋๋ค.

counter
ํจ์๊ฐ ํธ์ถ๋๋ฉด, ์ต๋ช
ํจ์ ์คํ ์ปจํ
์คํธ๊ฐ ๋ง๋ค์ด์ง๊ณ , ์ด ํจ์๋ ์์ ์ ๋ด๋ถ ์ฌ๋กฏ์ ์ ์ฅ๋ ์ธ๋ถ ๋ ์์ปฌ ํ๊ฒฝ์ ์ฐธ์กฐํฉ๋๋ค. ์ฌ๊ธฐ์ ์ธ๋ถ ๋ ์์ปฌ ํ๊ฒฝ์ outer
ํจ์์ ํ๊ฒฝ์ด๋ฉฐ, ์ฌ๊ธฐ์๋ ์ง์ญ ๋ณ์์ธ count
๊ฐ ์กด์ฌํ์ฃ .
๋ด๋ถ ํจ์๋ ๋ฐ๋ก ์ด ๋ด๋ถ ์ฌ๋กฏ์ ํตํด, outer
ํจ์์ ์ง์ญ ๋ณ์์ธ count
๋ฅผ ๊ธฐ์ตํ๊ณ ์ ๊ทผํ ์ ์๋ ๊ฒ์
๋๋ค. ๋ฐ๋ผ์ ์ด ํจ์๊ฐ ์คํ๋๋ฉด์ ์ธ๋ถ ํจ์(outer
)์ ์ง์ญ๋ณ์์ธ count
๋ฅผ 1 ์ฆ๊ฐ์์ผ 1์ ์ถ๋ ฅํ๊ฒ ๋ฉ๋๋ค.
์์ ์ฝ๋๋ฅผ ํตํ ํด๋ก์ ํ์ต
์ด์ ํด๋ก์ ๋ฅผ ๋ ์์ธํ ์์๋ณด๊ธฐ ์ํด ๊ตฌ์ฒด์ ์ธ ์์ ์ฝ๋๋ฅผ ๋ถ์ํด ๋ณด๊ฒ ์ต๋๋ค. ํด๋ก์ ๊ฐ ๋์ํ๋ ์๋ฆฌ๋ฅผ ์ดํดํ๋ ค๋ฉด, ๋ ๊ฐ์ง ๊ฐ๋ ์ ๋ช ํํ๊ฒ ์์์ผ ํ๋๋ฐ์. ๋ ๊ฐ์ง ๊ฐ๋ ์ด ๋ฐ๋ก ๋ ์์ปฌ ์ค์ฝํ์ ๋ด๋ถ ์ฌ๋กฏ์ ๋๋ค. ์์์ ๊ฐ๋จํ๊ฒ ์ธ๊ธํ์ง๋ง, ์ค์ํ ๊ฐ๋ ์ด๊ธฐ ๋๋ฌธ์ ํ ๋ฒ ๋ ๋ค๋ค๋ณผ๊ฒ์.
1. ๋ ์์ปฌ ์ค์ฝํ์ ๋ด๋ถ ์ฌ๋กฏ
์๋ฐ์คํฌ๋ฆฝํธ๋ ๋ณ์๋ฅผ ์ฐธ์กฐํ ๋, ๋ณ์๊ฐ ์ด๋์์ ์ ์ธ๋์๋์ง๋ฅผ ๊ธฐ์ค์ผ๋ก ๊ทธ ๋ณ์๋ฅผ ์ฐพ๋๋ฐ์, ์ด๊ฒ์ ๋ฐ๋ก ๋ ์์ปฌ ์ค์ฝํ๋ผ๊ณ ๋ถ๋ฆ ๋๋ค. ์ฝ๊ฒ ๋งํด๋ณด์๋ฉด, ํจ์๊ฐ ์ด๋์์ ์ ์ธ๋์๋์ง์ ๋ฐ๋ผ ์ ๊ทผํ ์ ์๋ ๋ณ์์ ๋ฒ์๊ฐ ๊ฒฐ์ ๋๋ค๋ ๋ป์ ๋๋ค.
์ข ๋ ๊ตฌ์ฒด์ ์ผ๋ก ์ดํด๋ณผ๊น์? ๋ ์์ปฌ ์ค์ฝํ๋ ๋ณ์๊ฐ ์ ์ธ๋ ์์น์ ๋ฐ๋ผ ์ค์ฝํ ์ฒด์ธ(Scope Chain)์ด ๋ง๋ค์ด์ง๋ ์๋ฆฌ์ ๋๋ค. ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ํจ์๊ฐ ์ ์ธ๋ ๋, ๊ทธ ํจ์๊ฐ ์ ์ธ๋ ์์น๋ฅผ ๊ธฐ์ค์ผ๋ก ์ค์ฝํ ์ฒด์ธ์ ๋ง๋ญ๋๋ค. ์ดํ ํด๋น ํจ์๊ฐ ์คํ๋ ๋, ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ์ด ์ค์ฝํ ์ฒด์ธ์ ๋ฐ๋ผ ๋ณ์๋ฅผ ์ฐพ์๊ฐ๋๋ค.

์ฌ๊ธฐ์ ์ค์ํ ์ญํ ์ ํ๋ ๊ฒ์ด ๋ฐ๋ก ๋ด๋ถ ์ฌ๋กฏ([[Environment]]
)์
๋๋ค. ๋ด๋ถ ์ฌ๋กฏ์ ํจ์๊ฐ ์์ฑ๋ ๋ ๋ง๋ค์ด์ง๋ ํน๋ณํ ์ ์ฅ ๊ณต๊ฐ์ผ๋ก, ํจ์๊ฐ ์ ์ธ๋ ํ๊ฒฝ์ ์ ๋ณด๋ฅผ ๋ด๊ณ ์์ต๋๋ค. ๋ด๋ถ ํจ์๋ ์ด ๋ด๋ถ ์ฌ๋กฏ์ ์ด์ฉํด, ์ธ๋ถ ํจ์์ ๋ณ์์ ํ๊ฒฝ์ ๊ธฐ์ตํ๊ณ ์ ๊ทผํ ์ ์๊ฒ ๋๋ ๊ฒ์
๋๋ค.
๋ค์ ์์ ๋ฅผ ํตํด ํ ๋ฒ ๋ ์์ธํ ์ดํด๋ณผ๊น์?
let username = 'John';
function greetUser() {
const greeting = 'Hello';
return function() {
console.log(`${greeting}, ${username}`);
};
}
const greet = greetUser();
greet(); // Hello, John
์ด ์ฝ๋์์ ๋ด๋ถ ํจ์๋ ๋ ๊ฐ์ง ๋ณ์๋ฅผ ๊ธฐ์ตํ๊ณ ์์ต๋๋ค. ์ฒซ ๋ฒ์งธ๋ ์ ์ญ ์ค์ฝํ์ ์กด์ฌํ๋ username
์
๋๋ค. ๋ด๋ถ ํจ์๊ฐ ์ ์ธ๋ ๋ ์ด๋ฏธ ์ด ๋ณ์๋ ์ ์ญ ํ๊ฒฝ์ ์์๊ณ , ๋ด๋ถ ํจ์๋ ์ด๋ฅผ ๊ธฐ์ตํ๊ณ ์ ๊ทผํ ์ ์์ต๋๋ค.
๋ ๋ฒ์งธ๋ ์์ ์ ๊ฐ์ธ๊ณ ์๋ ์ธ๋ถํจ์, greetUser
ํจ์์ ์ง์ญ ๋ณ์ greeting
์
๋๋ค. ์ธ๋ถ ํจ์๊ฐ ์ข
๋ฃ๋ ํ์๋ ๋ด๋ถ ํจ์๋ ์ด ๋ณ์์ ์ ๊ทผํ ์ ์๊ฒ ๋ฉ๋๋ค. ๋ด๋ถ ํจ์๊ฐ ์ด ๋ ๋ณ์๋ฅผ ๊ณ์ํด์ ์ฌ์ฉํ ์ ์๋ ์ด์ ๋ ๋ฐ๋ก ๋ด๋ถ ์ฌ๋กฏ ๋๋ถ์ด๋ฉฐ, ์ด๊ฒ์ด ๋ฐ๋ก ํด๋ก์ ์ ํต์ฌ์ ์ธ ์๋ ์๋ฆฌ์
๋๋ค.
2. ํด๋ก์ ์ ๋ํ ์๋ก์ด ์ ์
์ด์ ํด๋ก์ ๋ฅผ ๋ค์ ์ฝ๊ฒ ์ ์ํด ๋ณผ๊ฒ์. ํด๋ก์ ๋, โ๋ด๋ถ ํจ์๊ฐ ์ธ๋ถ ํจ์์ ๋ณ์๋ฅผ ๊ธฐ์ตํด, ์ธ๋ถ ํจ์๊ฐ ์ข ๋ฃ๋ ์ดํ์๋ ๊ณ์ ์ ๊ทผํ ์ ์๋ ํจ์โ์ ๋๋ค. ๋ด๋ถ ํจ์๊ฐ ์ธ๋ถ ํ๊ฒฝ์ ๋ณ์๋ฅผ ์ ์งํ๊ณ , ๊ด๋ฆฌํ ์ ์๋ ํน๋ณํ ๋ฅ๋ ฅ์ ํด๋ก์ ๋ผ๊ณ ์๊ฐํ๋ฉด ๋์ฑ ์ดํดํ๊ธฐ ์ฝ์ต๋๋ค. ๊ทธ๋์ ๋ด๋ถ ํจ์๊ฐ ์ธ๋ถ ํจ์์ ์ ์ธ๋ ๋ณ์๋ฅผ ๊ธฐ์ตํด, ์ธ๋ถ ํจ์๊ฐ ์ข ๋ฃ๋ ์ดํ์๋ ๊ทธ ๋ณ์์ ๊ณ์ํด์ ์ ๊ทผํ ์ ์๋๋ก ํ๋ ์๋ฐ์คํฌ๋ฆฝํธ์ ํน์ํ ๊ธฐ๋ฅ์ ๋๋ค.
์ธ๋ถ ํจ์๊ฐ ์คํ๋๋ฉด์ ๋ด๋ถ ํจ์๋ฅผ ๋ฐํํ๋ฉด, ์ธ๋ถ ํจ์๋ ์ข
๋ฃ๋์ง๋ง, ๋ด๋ถ ํจ์๋ ์ธ๋ถ ํจ์์์ ์ ์ธํ ๋ณ์์ ๊ทธ ๋ณ์๊ฐ ์ํ ํ๊ฒฝ์ ๊ธฐ์ตํฉ๋๋ค. ์ด๋ฌํ ํ๊ฒฝ ์ ๋ณด๊ฐ ํจ์์ ๋ด๋ถ ์ฌ๋กฏ([[Environment]]
)์ ์ ์ฅ๋๊ณ , ์ด๋ฅผ ํตํด ๋ด๋ถ ํจ์๋ ์ดํ ์คํ๋ ๋๋ ์ธ๋ถ ํจ์์ ๋ณ์๋ฅผ ์ฐธ์กฐํ ์ ์๊ฒ ๋ฉ๋๋ค.
์ฝ๊ฒ ๋งํด, ํด๋ก์ ๋ ๋ด๋ถ ํจ์๊ฐ โ์์ ์ด ํ์ด๋ ํ๊ฒฝ์ ์ ๋ ์์ง ์๊ณ ๊ณ์ ๊ธฐ์ตํ๋ ๋ฅ๋ ฅโ์ด๋ผ๊ณ ํ ์ ์์ต๋๋ค. ํด๋ก์ ๋๋ถ์ ์๋ฐ์คํฌ๋ฆฝํธ๋ ๋งค์ฐ ๊ฐ๋ ฅํ ์ํ ๊ด๋ฆฌ๋ ์บก์ํ๋ฅผ ๊ตฌํํ ์ ์์ฃ . ์ด์ ํด๋ก์ ๊ฐ ์ด๋ป๊ฒ ํ์ฉ๋๋์ง, ์ด์ด์ ์ดํด๋ณผ๊ฒ์.
ํ์ฉ ์ฌ๋ก
ํด๋ก์ ๋ ์๋ฐ์คํฌ๋ฆฝํธ์์ ๊ต์ฅํ ์ ์ฉํ๊ฒ ์ฐ์ด๋๋ฐ์. ๋ํ์ ์ธ ํ์ฉ ์ฌ๋ก๋ฅผ ํตํด ํด๋ก์ ์ ๋ํ ๊ฐ๋ ์ ์ ๋ฆฌํด ๋ณด๊ฒ ์ต๋๋ค.
1. ์ํ ์ ์ง ํจ์
ํด๋ก์ ๊ฐ ๊ฐ์ฅ ๋ง์ด ํ์ฉ๋๋ ์๋ ๋ฐ๋ก ์ํ ์ ์ง์ ๋๋ค. ์์ ์ดํด๋ณธ ๊ฐ๋ ์ ํ์ฉํ ๋ํ์ ์ธ ์ฌ๋ก์ธ๋ฐ์, ์ํ๋ฅผ ์ ์งํ๋ ๊ฐ๋จํ ์นด์ดํฐ ์์ ๋ฅผ ์ดํด๋ด ์๋ค.
function clickCounter() {
let clicks = 0;
return function() {
clicks += 1;
console.log(`ํด๋ฆญ ํ์: ${clicks}`);
};
}
const counter = clickCounter();
counter(); // ํด๋ฆญ ํ์: 1
counter(); // ํด๋ฆญ ํ์: 2
counter(); // ํด๋ฆญ ํ์: 3
์ ์ฝ๋์์ ๋ด๋ถ ํจ์๋ ์ธ๋ถ ํจ์์ clicks
๋ณ์๋ฅผ ํด๋ก์ ๋ฅผ ํตํด ๊ณ์ ๊ธฐ์ตํ๊ณ ์ ์งํ ์ ์์ต๋๋ค. ๋ด๋ถ ํจ์๊ฐ ํธ์ถ๋ ๋๋ง๋ค ๊ฐ์ด ์ฆ๊ฐํ๋ฉฐ ์ ์ง๋๋ ๊ฒ์ด ํด๋ก์ ๋๋ถ์
๋๋ค.
2. ๋ฐ์ดํฐ ์๋๊ณผ ์บก์ํ
ํด๋ก์ ๋ ๋ฐ์ดํฐ๋ฅผ ์ธ๋ถ๋ก๋ถํฐ ๋ณดํธํ๊ณ ์์ ํ๊ฒ ๊ด๋ฆฌํ๋ ๋ฐ์๋ ๋งค์ฐ ์ ์ฉํ๊ฒ ์ฐ์ ๋๋ค. ๋ฐ์ดํฐ๋ฅผ ์จ๊ธฐ๊ณ ์ ๊ทผ์ ์ ํํ๋ ๋ฐฉ๋ฒ์ ํด๋ก์ ๋ก ๊ตฌํํ ์ ์๋๋ฐ์, ๋ค์ ์์ ๋ฅผ ํตํด ์ดํด๋ณด๊ฒ ์ต๋๋ค.
function createAccount(initialBalance) {
let balance = initialBalance; // ์ธ๋ถ์์ ์ ๊ทผ ๋ถ๊ฐ๋ฅํ ํ๋ผ์ด๋น ๋ณ์
return {
deposit(amount) {
balance += amount;
console.log(`์
๊ธ ํ ์์ก: ${balance}`);
},
withdraw(amount) {
if(amount > balance) {
console.log('์์ก์ด ๋ถ์กฑํฉ๋๋ค.');
} else {
balance -= amount;
console.log(`์ถ๊ธ ํ ์์ก: ${balance}`);
}
}
};
}
const myAccount = createAccount(1000);
myAccount.deposit(500); // ์
๊ธ ํ ์์ก: 1500
myAccount.withdraw(300); // ์ถ๊ธ ํ ์์ก: 1200
myAccount.withdraw(1300); // ์์ก์ด ๋ถ์กฑํฉ๋๋ค.
์ฌ๊ธฐ์ balance
๋ผ๋ ๋ณ์๋ ์ธ๋ถ์์๋ ์ ๋๋ก ์ ๊ทผํ ์ ์๊ณ , ์ค์ง ๋ฐํ๋ ๋ฉ์๋ deposit
๊ณผ withdraw
๋ฅผ ํตํด์๋ง ์์ ํ ์ ์์ต๋๋ค. ์ด ๋ณ์๋ฅผ ๋ณดํธํ ์ ์๋ ์ด์ ๋, ๋ด๋ถ ํจ์๊ฐ balance
๋ณ์๋ฅผ ํด๋ก์ ๋ก ์ ์งํ๊ณ ์๊ธฐ ๋๋ฌธ์
๋๋ค. ์ด๋ฌํ ๋ฐฉ์์ ํตํด ์์ ํ๊ฒ ๋ฐ์ดํฐ๋ฅผ ๊ด๋ฆฌํ ์ ์๊ฒ ๋ฉ๋๋ค.

๋ง์น๋ฉฐ
์ง๊ธ๊น์ง ํด๋ก์ (Closure)์ ๊ฐ๋ ์ ์ ์ํ๊ณ , ๋ํ์ ์ธ ํ์ฉ ์์ ๊น์ง ํจ๊ป ์ดํด๋ณด์์ต๋๋ค. ์ด ๊ธ์ ํตํด ํด๋ก์ ๊ฐ ๋ ์ด์ ์ด๋ ต๊ณ ๋ฏ์ ๊ฐ๋ ์ด ์๋๋ผ, ์ฌ๋ฌ๋ถ์ ํ๋ก๊ทธ๋๋ฐ ์์ ์ ๋ ๋ ํ ๋์์ฃผ๋ ๋ฏฟ์์งํ ๋ฌด๊ธฐ๊ฐ ๋ ์ ์๊ธธ ๋ฐ๋๋๋ค.