
๊ธฐ์ด ์๋ฆฌ์ฆ ์ฒซ ๋ฒ์งธ์์ '์คํ ์ปจํ ์คํธ'์ ๊ธฐ๋ณธ ๊ฐ๋ ๊ณผ, ๋ณ์๋ค์ด ์์ฑ๋๊ณ ์ฐ์ด๋ '์๋ช ์ฃผ๊ธฐ'๋ฅผ ํ์ธํด ๋ณด์์ต๋๋ค. ์ฝ๋๊ฐ ์คํ๋๊ธฐ ์ ์ ์ด๋ฏธ ์์ง์ด ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ํ๋ณดํ๊ณ ์ค๋น๋ฅผ ๋ง์น๋ค๋ ์ฌ์ค์, ๊ทธ๋์ ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ๋จ์ํ '์์์ ์๋๋ก ํ ์ค์ฉ ์ฝ๋' ํํ๋ก๋ง ์๊ณ ์๋ ๋ง์ ์ด๋ค์๊ฒ ์๋ก์ด ์ฌ์ค๊ณผ๋ ๊ฐ์ ๊ฐ๋ ์ด์์ ๊ฒ๋๋ค.
๊ทธ๋ ๊ฒ ์ฒซ๋ฒ์งธ ์๋ฆฌ์ฆ๋ฅผ ๊ณต๋ถํ๋ฉด ํ ๊ฐ์ง ๋ณธ์ง์ ์ธ ์๋ฌธ์ด ๊ผฌ๋ฆฌ๋ฅผ ๋ญ ๋๋ค. ์์ง์ด ์คํ ์ปจํ ์คํธ๋ผ๋ ๋ ๋ฆฝ๋ ๊ณต๊ฐ์ ๋ง๋ค๊ณ ๋ณ์๋ค์ ๊ด๋ฆฌํ๋ ๊ฑด ์๊ฒ ๋๋ฐ, ๋ง์ฝ ํจ์ ์์ ๋ ๋ค๋ฅธ ํจ์๊ฐ ๊ฒน๊ฒน์ด ์ค์ฒฉ๋์ด ์๋ค๋ฉด ์์ง์ ์ด๋ค ๊ท์น์ผ๋ก ๋ณ์๋ฅผ ์ฐพ์ ๋์ค๊น์? ํ์ฌ ์ปจํ ์คํธ(๋ณ์๊ฐ ์ ์ฅ๋ ๊ณต๊ฐ)์ ๋ด๊ฐ ์ฐพ๋ ๋ณ์๊ฐ ์๋ค๋ฉด ์์ง์ ๊ทธ๋๋ก ์๋์ ๋ฉ์ถ๊ณ ์๋ฌ๋ฅผ ๋ฟ์ด๋ผ์ง ์๋๋ฉด ํ์ฌ ์ปจํ ์คํธ์์ ๋ค๋ฅธ ์ปจํ ์คํธ ๋๋ ์์ ์ปจํ ์คํธ๋ก ์ฐพ๊ธฐ ์์ํ ๊น์?
์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ๋ค๋ฃจ๋ค๋ณด๋ฉด "๋ถ๋ช ํ ํด๋น ๋ณ์๋ฅผ ์ ์ธํ ๊ธฐ์ต์ด ์๋๋ฐ ์ด๋์ ๊ฐ ๊ฐ์ ๊ธฐ๊ฐ ๋งํ๊ฒ ๋ฌผ์ด์ ์ถ๋ ฅ์ ํด์ฃผ๋ ๊ธฐํ์", "๋น์ฐํ ์ ๊ทผํ ์ ์์ ์ค ์์๋ ๋ณ์์ธ๋ฐ ReferenceError๋ฅผ ๋ฟ์ด๋ด๋ฉฐ ํ๋ก๊ทธ๋จ์ด ๋ฉ์ถฐ๋ฒ๋ฆฌ๋ ํ์" ๋ฑ์ ํ ๋ฒ์ฏค ๊ฒช์์ ๊ฒ๋๋ค. ์น ๊ฐ๋ฐ์๋ฅผ ์ค๋นํ๋ ํ์๋ค๋ถํฐ ์ฃผ๋์ด ๊ฐ๋ฐ์๋ค๊น์ง, ์๋ง์ ๋ฒ๊ทธ์ ๊ธฐ์ ๋ฉด์ ์ ๋ช์์ ๊ฐ์ฅ ๋ง์ด ์ข์ ํ๋ ์ง์ ์ด ๋ฐ๋ก ์ด '๋ณ์ ์ฐธ์กฐ์ ๊ท์น'์ ๋๋ค.
์ฌ๊ธฐ์์ ์ฐ๊ฒฐ๊ณ ๋ฆฌ๊ฐ ๋ฐ๋ก '๋ ์์ปฌ ์ค์ฝํ(Lexical Scope)'์ '์ค์ฝํ ์ฒด์ธ(Scope Chain)'์ ๋๋ค.
์ด๋ฒ ์ฅ์์๋ ์๋ฐ์คํฌ๋ฆฝํธ๋ผ๋ ์ธ์ด๊ฐ ๋ณ์์ ํ๋ ์์ญ(Scope)์ ๊ฒฐ์ ํ๋ ๋ ํนํ๊ณ ๊ณ ์ง์ค๋ฌ์ด ์ค๊ณ ์ฒ ํ์ ์์๋ณด๊ณ , ์์ง ๋ด๋ถ์ ๋งค๋ชจ๋ฆฌ ๋ด์ญ์ธ '์ธ๋ถ ๋ ์์ปฌ ํ๊ฒฝ ์ฐธ์กฐ(Outer Lexical Environment Reference)'๊ฐ ์ด๋ป๊ฒ ์ด ๋ฐฉ์๊ณผ ์ ๋ฐฉ์์ ์ ์ฌ์ฌ์ฒ๋ผ ์ฎ์ด๋ด๋์ง ๊ทธ๋ฆฌ๊ณ ๋ฐํ์ ์ด๋ฉด์ ์ค์ฒด๋ฅผ ์กฐ๊ธ ์์ธํ๊ฒ ๋ค์ฌ๋ค๋ณด๋ ค ํฉ๋๋ค. ๋จ์ํ ๋ณ์๋ฅผ '์๋ก ์ฐพ์ ์ฌ๋ผ๊ฐ๋ค.'๋ ๋ชจํธํ ๊ฐ๋ ์ด ์๋๋ผ, ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ์์ ์ผ๋ก ์ค์ฝํ๋ฅผ ๋ฐ๋ก ๋ณผ ์ ์๋ ๊ฒฝํ์ ์ํด์ ๋ง์ด์ฃ .
์ค์ฝํ(Scope)์ ์ง๊ด์ ๊ฐ๋

๋ฌ์์์ ์ ํต ์ธํ์ธ '๋งํธ๋ฃ์์นด'์ ๋๋ค. ํฐ ์ธํ์ ์ด๋ฉด ๊ทธ ์์ ์กฐ๊ธ ๋ ์์ ์ธํ์ด ์๊ณ ๋ ์ด๋ฉด ๋ ์์ ์ธํ์ด ์ค์ค์ด ๋์ค๋ ๊ตฌ์กฐ์ ๋๋ค. ์๋ฐ์คํฌ๋ฆฝํธ์ ์ค์ฝํ(Scope)๊ฐ ์ด ๋งํธ๋ฃ์์นด ์ธํ๊ณผ ๊ฐ์ ๊ตฌ์กฐ์ ๋๋ค. ๊ฐ์ฅ ๋ฐ๊นฅ์ ์๋ ๊ฑฐ๋ํ ์ธํ์ด '์ ์ญ ์ค์ฝํ(Global Scope)'์ด๊ณ ๊ทธ ์ธํ์ ์ด๊ณ ๋ค์ด๊ฐ๋ฉด ๋ํ๋๋ ์์ ์ธํ๋ค์ด ๊ฐ๊ฐ์ 'ํจ์ ์ค์ฝํ(Function Scope)' ํน์ '๋ธ๋ก ์ค์ฝํ(Block Scope)'๊ฐ ๋ฉ๋๋ค. ์ฌ๊ธฐ์ ์์ชฝ์ ์๋ ์์ ์ธํ์ ๋ฐ๊นฅ์ชฝ์ ์๋ ํฐ ์ธํ์ ๊ณต๊ฐ์ ํคํ ๋ค์ฌ๋ค ๋ณผ ์ ์์ง๋ง, ๋ฐ๊นฅ์ชฝ์ ํฐ ์ธํ์ ์์ชฝ ์ธํ ๋ด๋ถ์ ๋ฌด์์ด ๋ค์ด์๋์ง ์ ๋ ๋ค์ฌ๋ค๋ณผ ์ ์์ต๋๋ค. ํด๋น ๊ท์น์ด ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ์ง๋ฐฐํ๋ ๋ณ์ ์ ๊ทผ์ ๋์์น์ ๋๋ค.
๋ ์์ปฌ ์ค์ฝํ(Lexical Scope)
๋ ์์ปฌ(Lexical)์ด๋ ๋จ์ด๋ '์ดํ์ '์ด๋ผ๋ ๋ป์ ๊ฐ์ง๋๋ฐ ์ฆ, "์์ค ์ฝ๋๊ฐ ์์ฑ๋ ๋ฌธ๋งฅ๊ณผ ๊ตฌ์กฐ"๋ฅผ ์๋ฏธํฉ๋๋ค. ์ฝ๊ฒ ๋งํด์ ๋ ์์ปฌ ์ค์ฝํ๋ "ํจ์๊ฐ ์ด๋์ ํธ์ถ ๋์๋๊ฐ๊ฐ ์๋๋ผ, ์์ค ์ฝ๋ ์ ์ด๋์ ์ ์ธ๋์๋์ง์ ๋ฐ๋ผ ์์ ์ค์ฝํ๊ฐ ๊ฒฐ์ ๋๋ ๊ท์น"์ ๋ปํฉ๋๋ค. ์ด๊ฒ์ ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ๊ตฌ๋ ๋ฉ์ปค๋์ฆ์ธ 'ํ๊ฐ ๋จ๊ณ'์ ์ง๊ฒฐ๋์ด ์์ต๋๋ค. ์์ง์ ๋ฐํ์์ ์ฝ๋๋ฅผ ํ ์ค์ฉ ์คํํ๊ธฐ์ ์์, ์์ค ์ฝ๋๋ฅผ ์ญ ํ์ผ๋ฉฐ ํ์ฑ(Parsing)ํ๋ ๋จ๊ณ๋ฅผ ๊ฑฐ์นฉ๋๋ค. ์ด๋ ํจ์ ์ ์ธ๋ฌธ์ด ๋ฐฐ์น๋ ๋ฌผ๋ฆฌ์ ์ธ ๊ดํธ '{}' ๊ตฌ์กฐ๋ฅผ ๋ณด๊ณ "์ด ํจ์์ ์์ ์์ญ์ ์ฌ๊ธฐ๊ตฌ๋"๋ผ๊ณ ์ค์ฝํ ๊ด๊ณ๋ฅผ ํ์ ์ง์ด ๋ฉ๋ชจ๋ฆฌ์ ๊ธฐ๋กํฉ๋๋ค. ํธ์ถ ํ์ด๋ฐ ์ธ์ ๋ , ๋์ ์ผ๋ก ๋ณํ์ง ์๋ ์ ์ (Static)์ธ ๊ท์น์ ๋๋ค.
์์ค ํ์ธ
const userName = "global hongkd";
// printName ํจ์๋ ์ ์ญ์์ ์ ์ธ๋จ
function printName(){
console.log(userName);
}
function outerFunction(){
const userName = "local hongkildong";
printName(); // ์ฌ๊ธฐ์ printName ํจ์๋ฅผ ํธ์ถํจ
}
outerFunction(); // userName์ ๊ฐ์?
๋ง์ ์ฌ๋๋ค์ด outerFunction() ๋ด๋ถ์์ printName()์ด ํธ์ถ๋๋ ๊ฒ์ ๋ณด๊ณ , printName ๋ด๋ถ์ userName ์ง์ญ ๋ณ์์ธ "local hongkildong"์ ๊ฐ์ ธ์ฌ ๊ฒ์ด๋ผ ์๊ฐํฉ๋๋ค. ํธ์ถ๋ ์์น์ ์ฃผ๋ณ ํ๊ฒฝ์ ๋ณธ ์ ์ด์ฃ . ํ์ง๋ง, ์๋ฐ์คํฌ๋ฆฝํธ๋ ๋ ์์ปฌ ์ค์ฝํ๋ฅผ ๋ฐ๋ฆ ๋๋ค.
๊ฒฐ๊ณผ
1. printName() ํจ์๊ฐ ์ ์ธ๋ ๋ฌผ๋ฆฌ์ ์์น๋ ๋ฐ๊นฅ์ชฝ ์ ์ญ(Global)์ ๋๋ค.
2. printName() ํจ์์ ์์ ์์ญ์ ์ฝ๋๊ฐ ํ๊ฐ๋๋ ์์ ์ ์ด๋ฏธ ์ ์ญ ์ค์ฝํ๋ก ์ค์ ๋ฉ๋๋ค.
3. outerFunction() ์์์ ํธ์ถ๋์ด๋, printName() ํจ์๋ ์๊ธฐ๊ฐ ์ ์ธ๋ ์์ญ์ธ ์ ์ญ ์ค์ฝํ์ ๋ณ์ userName๋ง์ ๋ฐ๋ผ๋ด ๋๋ค.
4. ๊ฒฐ๋ก ์ ์ผ๋ก ํ๋ฉด์๋ "global hongkd"์ด ์ถ๋ ฅ๋ฉ๋๋ค.
๋ฉ๋ชจ๋ฆฌ ๋จ์ ์ฐ๊ฒฐ๊ณ ๋ฆฌ์ธ ์ค์ฝํ ์ฒด์ธ(Scope Chain)
ํจ์๊ฐ ์คํ๋ ๋ ์์ ์ค์ฝํ๋ฅผ ์ฐพ์ ์ฌ๋ผ๊ฐ๋ ์ด ์ ๊ธฐ์ ์ธ ์ง๋๋ฅผ '์ค์ฝํ ์ฒด์ธ'์ด๋ผ๊ณ ํฉ๋๋ค. ์๋ฐ์คํฌ๋ฆฝํธ ํ์ค ๋ช ์ธ(ECMAScript Specification)๋ฅผ ๊ธฐ๋ฐ์ผ๋ก, ์คํ ์ปจํ ์คํธ์ ๋ฉ๋ชจ๋ฆฌ ๋จ์์ ์ด๋ป๊ฒ Linked List์ฒ๋ผ ์ฎ์ด๋์ง ์์๋ด ์๋ค.
LexicalEnvironment & Outer Reference
์คํ ์ปจํ ์คํธ๋ ์ฝ๋๊ฐ ์คํ๋๊ธฐ ์ํ ๊ณต๊ฐ์ด๋ผ๊ณ ํ์ต๋๋ค. ํด๋น ๊ณต๊ฐ์๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ด๋ฆฌํ๋ ๋ ๊ฐ์ ํต์ฌ ๋ด์ญ์ด ๋ค์ด์์ต๋๋ค.
1. EnvironmentRecord(ํ๊ฒฝ ๋ ์ฝ๋) : ํ์ฌ ๊ณต๊ฐ์ ์ ์ธ๋ ๋ณ์์ ํจ์ ์ด๋ฆ์ด ์ ํ ๋ด์ญ
2. Outer Lexical Environment Reference(์ธ๋ถ ๋ ์์ปฌ ํ๊ฒฝ ์ฐธ์กฐ) : ์์ ์ ๊ฐ์ธ๊ณ ์๋ '์์ ๊ณต๊ฐ'์ ์ฃผ์๋ก
์ฝ๋๊ฐ ์คํ๋๋ค๊ฐ ํ์ฌ ๊ณต๊ฐ์ ํ๊ฒฝ ๋ ์ฝ๋์ ์๋ ๋ณ์๋ฅผ ๋ง๋๋ฉด, ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ๋นํฉํ์ง ์๊ณ ์ธ๋ถ ๋ ์์ปฌ ํ๊ฒฝ ์ฐธ์กฐ๊ฐ ๊ฐ๋ฆฌํค๋ ์์ ๊ณต๊ฐ์ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ก ์ด๋ํฉ๋๋ค. ๊ทธ๋ ๋ค๋ฉด ํ๊ฒฝ ๋ ์ฝ๋์์๋ ๋ณ์๋ฅผ ์ฐพ์ง ๋ชปํ๋ฉด ์ด๋ป๊ฒ ๋ ๊น? ํด๋น ๊ณต๊ฐ์ Outer ์ฐธ์กฐ๋ฅผ ํ๊ณ ๋ ์์ ์๋ ์์ ๊ณต๊ฐ์ผ๋ก ์ด๋ํฉ๋๋ค.
์ด ํํ๊ฐ ์ ์ฌ์ฌ์ฒ๋ผ ์ฐ๊ฒฐ๋์ด ์๋ค๊ณ ํด์ ์ค์ฝํ ์ฒด์ธ์ด๋ผ๊ณ ํ๋ฉฐ, ์ด ์ฒด์ธ์ ์ข ์ฐฉ์ง์ธ ์ ์ญ ๋ ์์ปฌ ํ๊ฒฝ(Global Lexical Environment)์ Outer ์ฐธ์กฐ๋ null์ ๊ฐ๋ฆฌํค๋ฉฐ, ์ฌ๊ธฐ๊น์ง ์์๋ ๋ณ์๋ฅผ ์ฐพ์ง ๋ชปํ๋ฉด ๋น๋ก์ ReferenceError๊ฐ ๋ฐ์ํฉ๋๋ค.
์์ค ํ์ธ
const money = 1000; // ์ ์ญ ๋ณ์
// (1) ์ ์ญ ์ปจํ
์คํธ ์์ฑ: Global LexicalEnvironment๊ฐ ๋ฉ๋ชจ๋ฆฌ์ ํ๋ณด(Outer: null)
function bank(){
const money = 50000; // bank ์ง์ญ ๋ณ์
// (2) bank ํจ์ ์ ์ธ: ํ๊ฐ ๋จ๊ณ์์ bank์ ์์ ์ค์ฝํ๋ '์ ์ญ'์ผ๋ก ์ค์
function withdraw(){
console.log("์คํ point(withdraw) : ", money);
}
return withdraw;
}
const myWithdraw = bank(); // bank๊ฐ ์คํ๋๊ณ withdraw ํจ์๋ฅผ ๋ฆฌํด
myWithdraw(); // bank ํจ์๊ฐ ๋๋ ๋ค, ์ ์ญ์์ withdraw๋ฅผ ๋
๋ฆฝ์ ์ผ๋ก ์คํ
๊ฒฐ๊ณผ
1. ์์ค๊ฐ ์ฝํ๋ฉด์ ์ ์ญ ์คํ ์ปจํ ์คํธ๊ฐ ์์ฑ๋๊ณ , ํด๋น ์ปจํ ์คํธ์ ๋ด๋ถ ํ๊ฒฝ ๋ ์ฝ๋์ 'money = 1000'๊ณผ bank๋ผ๋ ํจ์ ์ด๋ฆ์ด ๋ค์ด๊ฐ๋๋ค. ์ ์ญ์ ์ต์์ ๊ณต๊ฐ์ด๋ฏ๋ก ๋ ์ด์ ์๋ก ๊ฐ ๊ณณ์ด ์์ด '์ธ๋ถ ๋ ์์ปฌ ํ๊ฒฝ ์ฐธ์กฐ'๋ null๋ก ๋ฌถ์ ๋๋ค.
2. bank() ํจ์๊ฐ ํธ์ถ๋ฉ๋๋ค. Stack์ผ๋ก ๋ณด๋ฉด ์ ์ญ ์ปจํ ์คํธ(money, bank()) ์์ bank ํจ์๊ฐ ์์ด๋ ๊ตฌ์กฐ์ ๋๋ค. bank ์ปจํ ์คํธ์ ๋ด๋ถ ํ๊ฒฝ ๋ ์ฝ๋์๋ 'money = 50000'๊ณผ withdraw ํจ์ ์ด๋ฆ์ด ๋ค์ด๊ฐ๋๋ค. ์ด๋, bank ํจ์๋ ์์ค ์ฝ๋ ์ ์ ์ญ์ผ๋ก ์ค์ ๋ ํจ์์ ๋๋ค. ๊ทธ๋์ bank ์ปจํ ์คํธ์ ์๋ ์ธ๋ถ ๋ ์์ปฌ ํ๊ฒฝ ์ฐธ์กฐ๋ ์ ์ญ ์ปจํ ์คํธ๋ฅผ ํฅํด ๋ฌถ์ ๋๋ค.
[์ ์ญ ๋ ์์ปฌ ํ๊ฒฝ] (๋ฉ๋ชจ๋ฆฌ ์ฃผ์: 0x1111)
- ํ๊ฒฝ ๋ ์ฝ๋ : money = 1000, bank (ํจ์ ๊ฐ์ฒด)
- ์ธ๋ถ ์ฐธ์กฐ(Outer) : null << (์ ์ญ ์์๋ ์๋ฌด๊ฒ๋ ์๊ธฐ ๋๋ฌธ์ null)
ใโฒ
ใโ (์ฐ๊ฒฐ)
[bank ๋ ์์ปฌ ํ๊ฒฝ] (๋ฉ๋ชจ๋ฆฌ ์ฃผ์: 0x2222)
- ํ๊ฒฝ ๋ ์ฝ๋ : money = 50000, withdraw (ํจ์ ๊ฐ์ฒด)
- ์ธ๋ถ ์ฐธ์กฐ(Outer) : 0x1111 (์ ์ญ ์ฃผ์) << (null์ด ์๋๋ผ ์ ์ญ ๋ฐฉ์ ๊ฐ๋ฆฌํด)
3. bank() ํจ์ ๋ด๋ถ์์ withdraw() ํจ์๊ฐ ์ ์ธ๋ฉ๋๋ค. withdraw ํจ์๋ bank ํจ์ ๋ด๋ถ(์ง์ญ)์์ ์ ์ธ๋์๊ณ ์ด ๋ฌผ๋ฆฌ์ ์ธ ์์น ๋๋ฌธ์, withdraw ํจ์๋ ์์ฑ๋์๋ง์ ์์ ์ปจํ ์คํธ๋ bank๊ฐ ๋ฉ๋๋ค. ์ฆ ์ธ๋ถ ๋ ์์ปฌ ํ๊ฒฝ ์ฐธ์กฐ๋ bank ์ปจํ ์คํธ์ ๋ฌถ์ ๋๋ค.
4. bank() ํจ์๊ฐ ์ข ๋ฃ๋ฉ๋๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ Stack์์๋ bank() ํจ์๊ฐ ์ฌ๋ผ์ง๋๋ค. ๊ทธ๋ ์ง๋ง bank ํจ์๊ฐ ๋ฆฌํดํ withdraw ํจ์๋ myWithdraw๋ผ๋ ์ด๋ฆ์ ์ ์ญ ์ปจํ ์คํธ์ ๋จ์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ myWithdraw๋ ์ธ๋ถ ๋ ์์ปฌ ํ๊ฒฝ ์ฐธ์กฐ์ธ bank ์ปจํ ์คํธ์ ์ฐ๊ฒฐ๊ณ ๋ฆฌ๋ ์กด์ฌํฉ๋๋ค.
5. myWithdraw() ํจ์๊ฐ ํธ์ถ๋ฉ๋๋ค. ์ ์ญ ์ปจํ ์คํธ์ ๋ด๋ถ ํ๊ฒฝ ๋ ์ฝ๋์ ๋ค์ด์๋ myWithdraw() ํจ์์ ์ํด withdraw ํจ์๊ฐ ์คํ๋ฉ๋๋ค. withdraw์์ ์ถ๋ ฅํ๊ณ ์ ํ๋ money๋ฅผ ์ถ๋ ฅํ๋ ค๊ณ ๋ดค๋๋ ๋ด๋ถ ํ๊ฒฝ ๋ ์ฝ๋์ money๋ผ๋ ๋ณ์๊ฐ ์กด์ฌํ์ง ์์ต๋๋ค. ๊ทธ๋์ ์ธ๋ถ ๋ ์์ปฌ ํ๊ฒฝ ์ฐธ์กฐ์ ์ํด bank ํจ์๋ ์ด๋ฏธ ์คํ ์ข ๋ฃ๋์ด ์ฌ๋ผ์ก์ง๋ง ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅ๋์ด ์๋ bank ํจ์ ๋ด์ money ๋ณ์๋ฅผ ์ฐพ์ ์ถ๋ ฅํฉ๋๋ค. (ํด๋น ํ์์ด ํฅํ ๋ฐฐ์ฐ๊ฒ ๋ ํด๋ก์ ์ ํต์ฌ ๋ด์ฉ์ด ๋ฉ๋๋ค.)
[์ ์ญ ๋ ์์ปฌ ํ๊ฒฝ] (๋ฉ๋ชจ๋ฆฌ ์ฃผ์: 0x1111)
- ํ๊ฒฝ ๋ ์ฝ๋ : money = 1000, bank (ํจ์ ๊ฐ์ฒด)
- ์ธ๋ถ ์ฐธ์กฐ(Outer) : null << (์ ์ญ ์์๋ ์๋ฌด๊ฒ๋ ์๊ธฐ ๋๋ฌธ์ null)
ใโฒ
ใโ (์ฐ๊ฒฐ)
[bank ๋ ์์ปฌ ํ๊ฒฝ] (๋ฉ๋ชจ๋ฆฌ ์ฃผ์: 0x2222)
- ํ๊ฒฝ ๋ ์ฝ๋ : money = 50000, withdraw (ํจ์ ๊ฐ์ฒด)
- ์ธ๋ถ ์ฐธ์กฐ(Outer) : 0x1111 (์ ์ญ ์ฃผ์) << (null์ด ์๋๋ผ ์ ์ญ ๋ฐฉ์ ๊ฐ๋ฆฌํด)
ใโฒ
ใโ (์ฐ๊ฒฐ)
[withdraw ๋ ์์ปฌ ํ๊ฒฝ] (๋ฉ๋ชจ๋ฆฌ ์ฃผ์: 0x3333)
- ํ๊ฒฝ ๋ ์ฝ๋ : ๋น์ด์์
- ์ธ๋ถ ์ฐธ์กฐ (Outer) : 0x2222 (bank ์ฃผ์) << (bank์์ ์ ์ธ๋์๊ธฐ ๋๋ฌธ์)
ํ์ ์์๋ ์ ์ ์ญ ๋ณ์๋ฅผ ๊ถ์ฅํ์ง ์์๊น?
์ค๋ฌด์์๋ ์๋์ด๋ค์ด ์ฃผ๋์ด๋ค์ด ์์ฑํ ์ฝ๋๋ฅผ ๋ฆฌ๋ทฐํ ๋ ๊ฐ์ฅ ๋ง์ด ํ๋ ์ง์ ์ค ํ๋๊ฐ '์ ์ญ ๋ณ์ ์ต์ํ' ์ผ ๊ฒ๋๋ค. ๋จ์ํ ์ง์ ๋ถํ๊ธฐ ๋๋ฌธ์ ๊ฐ ์๋๋ผ, ์ ์ญ ๋ณ์ ๋จ๋ฐ์ด ๋ง๋๋ ๋ง์ ์ด์๋ค ๋๋ฌธ์ผ ๊ฒ์ ๋๋ค.
- ์ค์ฝํ ์ฒด์ธ ์ข
์ฐฉ์ง ๊ฒ์์ผ๋ก ์ธํ ์ฑ๋ฅ ์ ํ
- ์์ง์ด ๋ณ์๋ฅผ ์ฐพ์ ๋ ํ์ฌ ์ง์ญ ์ค์ฝํ๋ถํฐ ์ฒด์ธ์ ํ๊ณ ๋งจ ์๊น์ง ์ด๋ํฉ๋๋ค. ์ ์ญ ๋ณ์๋ฅผ ๋น๋ฒํ๊ฒ ํธ์ถํ๋ฉด ๋งค๋ฒ ์ค์ฝํ ์ฒด์ธ์ ์ต์๋จ๊น์ง ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ฑฐ์ฌ๋ฌ ์ฌ๋ผ๊ฐ์ผ ํ๋ฏ๋ก, ์ฒด์ธ์ด ๊น์์๋ก ์์ฃผ ๋ฏธ์ธํ์ง๋ง ๋ถํ์ํ ํ์ ๋น์ฉ์ด ๋ฐ์ํฉ๋๋ค. - ๋ค์์คํ์ด์ค ์ค์ผ
- ๋๊ท๋ชจ ํ์ ํ๋ก์ ํธ์์๋ ์์ญ ๋ช ์ ๊ฐ๋ฐ์๊ฐ ๋ง๋ ์๋ฐฑ ๊ฐ์ ๋ชจ๋์ด ํฉ์ณ์ง๋๋ค. ์ ์ญ ๋ณ์๋ฅผ ์ฐ๋ฉด ๋ด๊ฐ ๋ง๋ ๋ณ์๋ฅผ ๋ค๋ฅธ ํ์์ด ๋ค๋ฅธ ํ์ผ์์ ๋ฎ์ด์ฐ๊ฑฐ๋ ์ถฉ๋์ด ๋๋ฉด์ ์์ธก ๋ถ๊ฐ๋ฅํ ๋ฐํ์ ๋ฒ๊ทธ๋ฅผ ๋ง๋ค์ด๋ ๋๋ค. - ๊ฐ๋น์ง ์ปฌ๋ ์
(GC) ๋์ ์ ์ธ๋ก ์ธํ ๋ฉ๋ชจ๋ฆฌ ๋์
- ํจ์ ์ค์ฝํ ๋ด๋ถ์ ๋ณ์๋ค์ ํจ์ ์คํ์ด ๋๋ ์ปจํ ์คํธ๊ฐ ์๋ฉธํ๋ฉด ๋ฉ๋ชจ๋ฆฌ ์ฒญ์๋ถ์ธ ๊ฐ๋น์ง ์ปฌ๋ ํฐ๊ฐ ์๊ฑฐํด ๊ฐ๋๋ค. ํ์ง๋ง ์ ์ญ ๋ณ์๋ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์์ ํ ์ข ๋ฃ๋ ๋(์น ํ์ด์ง๋ฅผ ๋ซ์ ๋)๊น์ง ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ๊ณ์ ์ฐจ์งํ๊ณ ์์ํ ์ด์๋จ์ต๋๋ค. ์ ์ญ ๋ณ์๊ฐ ๋ง์์ง์๋ก ๋ธ๋ผ์ฐ์ ๊ฐ ๋ฌด๊ฑฐ์์ง๊ณ ์ฑ๋ฅ์ด ์ ํ๋๋ ์ฃผ์์ธ์ด ๋ฉ๋๋ค.
'DEVELOPMENT > Javascript' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| ์๋ฐ์คํฌ๋ฆฝํธ ๊ธฐ์ด ์๊ธฐ ์๋ฆฌ์ฆ - 1: ์คํ ์ปจํ ์คํธ ๋ฐ ํธ์ด์คํ ์ ๋ํด์ (0) | 2026.05.18 |
|---|