ํ‹ฐ์Šคํ† ๋ฆฌ ๋ทฐ

ํด๋กœ์ €(closure)๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ณ ์œ ์˜ ๊ฐœ๋…์ด ์•„๋‹Œ ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์—์„œ ์‚ฌ์šฉ๋˜๋Š” ์ค‘์š”ํ•œ ํŠน์„ฑ์œผ๋กœ MDN์—์„œ๋Š” ํด๋กœ์ €๋ฅผ "ํ•จ์ˆ˜์™€ ๊ทธ ํ•จ์ˆ˜๊ฐ€ ์„ ์–ธ๋œ ๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝ๊ณผ์˜ ์กฐํ•ฉ"์ด๋ผ๊ณ  ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

 

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


๋ ‰์‹œ์ปฌ ์Šค์ฝ”ํ”„

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์€ ํ•จ์ˆ˜๋ฅผ ์–ด๋””์„œ ์ •์˜ํ–ˆ๋Š”์ง€์— ๋”ฐ๋ผ ์ƒ์œ„ ์Šค์ฝ”ํ”„์ธ ๋ ‰์‹œ์ปฌ ์Šค์ฝ”ํ”„(์ •์  ์Šค์ฝ”ํ”„)๋ฅผ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค.

 

const x = 1;

function foo () {
    const x = 10;
    bar();
}

function bar () {
    console.log(X);
}

foo(); // 1
bar(); // 1

 

์œ„ ์˜ˆ์ œ์˜ foo ํ•จ์ˆ˜์™€ bar ํ•จ์ˆ˜๋Š” ๋ชจ๋“œ ์ „์—ญ์—์„œ ์ •์˜๋œ ์ „์—ญ ํ•จ์ˆ˜๋กœ foo ํ•จ์ˆ˜์™€ bar ํ•จ์ˆ˜ ๋ชจ๋‘ ์ƒ์œ„ ์Šค์ฝ”ํ”„๋Š” ์ „์—ญ์ž…๋‹ˆ๋‹ค. 

์ฆ‰, ํ•จ์ˆ˜์˜ ์ƒ์œ„ ์Šค์ฝ”ํ”„๋Š” ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•œ ์œ„์น˜์— ์˜ํ•ด ์ •์ ์œผ๋กœ ๊ฒฐ์ •๋˜๊ณ  ๋ณ€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

 

๋”ฐ๋ผ์„œ ๋ ‰์‹œ์ปฌ ์Šค์ฝ”ํ”„๋Š” ๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝ์˜ "์™ธ๋ถ€ ๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝ์— ๋Œ€ํ•œ ์ฐธ์กฐ"์— ์ €์žฅํ•  ์ฐธ์กฐ๊ฐ’, ์ฆ‰ ์ƒ์œ„ ์Šค์ฝ”ํ”„์— ๋Œ€ํ•œ ์ฐธ์กฐ๋Š” ํ•จ์ˆ˜ ์ •์˜๊ฐ€ ํ‰๊ฐ€๋˜๋Š” ์‹œ์ ์— ํ•จ์ˆ˜๊ฐ€ ์ •์˜๋œ ํ™˜๊ฒฝ(์œ„์น˜)์— ์˜ํ•ด ๊ฒฐ์ •๋ฉ๋‹ˆ๋‹ค.


ํ•จ์ˆ˜ ๊ฐ์ฒด์˜ ๋‚ด๋ถ€ ์Šฌ๋กฏ [[Environment]]

ํ•จ์ˆ˜๋Š” ์ž์‹ ์˜ ๋‚ด๋ถ€ ์Šฌ๋กฏ [[Environment]]์— ์ž์‹ ์ด ์ •์˜๋œ ํ™˜๊ฒฝ, ์ฆ‰ ์ƒ์œ„ ์Šค์ฝ”ํ”„์˜ ์ฐธ์กฐ๋ฅผ ์ €์žฅํ•˜์—ฌ ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜๋Š” ํ™˜๊ฒฝ๊ณผ๋Š” ์ƒ๊ด€์—†์ด ์ž์‹ ์ด ์ •์˜๋œ ํ™˜๊ฒฝ์„ ๊ธฐ์–ตํ•ฉ๋‹ˆ๋‹ค.

 

const x = 1;

function foo () {
    const x = 10;
    
    // ์ƒ์œ„ ์Šค์ฝ”ํ”„๋Š” ํ•จ์ˆ˜ ์ •์˜ ํ™˜๊ฒฝ(์œ„์น˜)์— ๋”ฐ๋ผ ๊ฒฐ์ •
    // ํ•จ์ˆ˜ ํ˜ธ์ถœ ์œ„์น˜์™€ ์ƒ์œ„ ์Šค์ฝ”ํ”„๋Š” ์•„๋ฌด๋Ÿฐ ๊ด€๊ณ„๊ฐ€ ์—†์Œ
    bar();
}

// ํ•จ์ˆ˜ bar๋Š” ์ž์‹ ์˜ ์ƒ์œ„ ์Šค์ฝ”ํ”„, ์ฆ‰ ์ „์—ญ ๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝ์„ [[Environment]]์— ์ €์žฅํ•˜์—ฌ ๊ธฐ์–ต
function bar () {
    console.log(X);
}

foo(); // 1
bar(); // 1

 

์œ„ ์˜ˆ์ œ์—์„œ barํ•จ์ˆ˜๊ฐ€ ์ „์—ญ ๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝ์„ ์ €์žฅํ•˜์—ฌ ๊ธฐ์–ตํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ์ž์‹ ์˜ ๋‚ด๋ถ€ ์Šฌ๋กฏ [[Environment]]์— ์ €์žฅ๋œ ์ƒ์œ„ ์Šค์ฝ”ํ”„์˜ ์ฐธ์กฐ๋Š” ํ˜„์žฌ ์‹คํ–‰ ์ค‘์ธ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ์˜ ๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝ์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


ํด๋กœ์ €์™€ ๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝ

์™ธ๋ถ€ ํ•จ์ˆ˜๋ณด๋‹ค ์ค‘์ฒฉ ํ•จ์ˆ˜๊ฐ€ ๋” ์˜ค๋ž˜ ์œ ์ง€๋˜๋Š” ๊ฒฝ์šฐ ์ค‘์ฒฉ ํ•จ์ˆ˜๋Š” ์ด๋ฏธ ์ƒ๋ช… ์ฃผ๊ธฐ๊ฐ€ ์ข…๋ฃŒํ•œ ์™ธ๋ถ€ ํ•จ์ˆ˜์˜ ๋ณ€์ˆ˜๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ ์ด๋Ÿฌํ•œ ์ค‘์ฒฉ ํ•จ์ˆ˜๋ฅผ ํด๋กœ์ €๋ผ๊ณ  ๋ถ€๋ฆ…๋‹ˆ๋‹ค.

 

const x = 1;

function outer () {
    const x = 10;
    const inner = function () { console.log(x); };
    return inner;
}

// outer ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ์ค‘์ฒฉ ํ•จ์ˆ˜ inner๋ฅผ ๋ฐ˜ํ™˜
const innerFunc = outer();
innerFunc(); // 10
  • outer ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด outer ํ•จ์ˆ˜๋Š” ์ค‘์ฒฉ ํ•จ์ˆ˜ inner๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ  ์ƒ๋ช… ์ฃผ๊ธฐ๋ฅผ ๋งˆ๊ฐ
  • outer ํ•จ์ˆ˜์˜ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ(์ง€์—ญ ๋ณ€์ˆ˜ x์™€ ๋ณ€์ˆ˜ ๊ฐ’ 10์ด ์ €์žฅ๋˜์–ด ์žˆ์Œ)๋Š” ์‹คํ–‰ ์ปจํ…์ŠคํŠธ ์Šคํƒ์—์„œ ์ œ๊ฑฐ๋จ
  • outer ํ•จ์ˆ˜์˜ ๋ ‰์‹œ์ปฌ ํ™˜๊ฒฐ๊นŒ์ง€ ์†Œ๋ฉธํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— innerFunc์€ 10์„ ๋ฐ˜ํ™˜ํ•จ

์œ„ ์˜ˆ์ œ๋ฅผ ํ†ตํ•ด inner๋Š” ์™ธ๋ถ€ ํ•จ์ˆ˜์˜ ์ƒ์กด ์—ฌ๋ถ€์™€ ์ƒ๊ด€์—†์ด ์ž์‹ ์ด ์ •์˜๋œ ์œ„์น˜์— ์˜ํ•ด ๊ฒฐ์ •๋œ ์ƒ์œ„ ์Šค์ฝ”ํ”„๋ฅผ ๊ธฐ์–ตํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด์ฒ˜๋Ÿผ ์ค‘์ฒจ ํ•จ์ˆ˜ inner ๋‚ด๋ถ€์—์„œ๋Š” ์ƒ์œ„ ์Šค์ฝ”ํ”„๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ƒ์œ„ ์Šค์ฝ”ํ”„์˜ ์‹๋ณ„์ž๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๊ณ  ์‹๋ณ„์ž์˜ ๊ฐ’์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ๋ชจ๋“  ํ•จ์ˆ˜๋Š” ์ƒ์œ„ ์Šค์ฝ”ํ”„๋ฅผ ๊ธฐ์–ตํ•˜๋ฏ€๋กœ ์ด๋ก ์ ์œผ๋กœ ๋ชจ๋“  ํ•จ์ˆ˜๋Š” ํด๋กœ์ €์ด์ง€๋งŒ, ์ƒ์œ„ ์Šค์ฝ”ํ”„์˜ ์‹๋ณ„์ž๋ฅผ ์ฐธ์กฐํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ๋ชจ๋“  ๋ธŒ๋ผ์šฐ์ €๋Š” ์ตœ์ ํ™”๋ฅผ ํ†ตํ•ด ์ƒ์œ„ ์Šค์ฝ”ํ”„๋ฅผ ๊ธฐ์–ตํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ํด๋กœ์ €๋ผ๊ณ  ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

 

๋”ฐ๋ผ์„œ ํด๋กœ์ €๋Š” ์ค‘์ฒฉ ํ•จ์ˆ˜๊ฐ€ ์ƒ์œ„ ์Šค์ฝ”ํ”„์˜ ์‹๋ณ„์ž๋ฅผ ์ฐธ์กฐํ•˜๊ณ  ์žˆ๊ณ  ์ค‘์ฒฉ ํ•จ์ˆ˜๊ฐ€ ์™ธ๋ถ€ ํ•จ์ˆ˜๋ณด๋‹ค ๋” ์˜ค๋ž˜ ์œ ์ง€๋˜๋Š” ๊ฒฝ์šฐ์— ํ•œ์ •ํ•˜๋Š” ๊ฒƒ์ด ์ผ๋ฐ˜์ ์ž…๋‹ˆ๋‹ค.


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

ํด๋กœ์ €๋Š” ์ƒํƒœ๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ๋ณ€๊ฒฝํ•˜๊ณ  ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด์„œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

 

ํด๋กœ์ €๋ฅผ ํ™œ์šฉํ•ด ์ƒํƒœ๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ๋ณ€๊ฒฝํ•˜๊ณ  ์œ ์ง€ํ•˜๋Š” ์˜ˆ์ œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

 

// ์นด์šดํŠธ ์ƒํƒœ ๋ณ€๊ฒฝ ํ•จ์ˆ˜
const increase = (function () {
    // ์นด์šดํŠธ ์ƒํƒœ ๋ณ€์ˆ˜
    let num = 0;
    
    // ํด๋กœ์ €
    return function () {
    	// ์นด์šดํŠธ ์ƒํƒœ๋ฅผ 1๋งŒํผ ์ฆ๊ฐ€
    	return ++num;
    };
}());

console.log(increase()); // 1
console.log(increase()); // 2
console.log(increase()); // 3
  • ์ฆ‰์‹œ ์‹คํ–‰ ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜๊ณ  ์ฆ‰์‹œ ์‹คํ–‰ ํ•จ์ˆ˜๊ฐ€ ๋ฐ˜ํ™˜ํ•œ ํ•จ์ˆ˜๊ฐ€ increase ๋ณ€์ˆ˜์— ํ• ๋‹น๋จ
  • increase ๋ณ€์ˆ˜์— ํ• ๋‹น๋œ ํ•จ์ˆ˜๋Š” ์ƒ์œ„ ์Šค์ฝ”ํ”„์ธ ์ฆ‰์‹œ ์‹คํ–‰ ํ•จ์ˆ˜์˜ ๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝ์„ ๊ธฐ์–ตํ•˜๋Š” ํด๋กœ์ €
  • ๋”ฐ๋ผ์„œ increase๋Š” ์นด์šดํŠธ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•œ ์ž์œ  ๋ณ€์ˆ˜ num์„ ์–ธ์ œ ์–ด๋””์„œ ํ˜ธ์ถœํ•˜๋“ ์ง€ ์ฐธ์กฐ/๋ณ€๊ฒฝ์ด ๊ฐ€๋Šฅ

์ด์ฒ˜๋Ÿผ ํด๋กœ์ €๋Š” ์ƒํƒœ๊ฐ€ ์˜๋„์น˜ ์•Š๊ฒŒ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋„๋ก ์ƒํƒœ๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ์€๋‹‰ํ•˜๊ณ  ํŠน์ • ํ•จ์ˆ˜์—๊ฒŒ๋งŒ ์ƒํƒœ ๋ณ€๊ฒฝ์„ ํ—ˆ์šฉํ•˜์—ฌ ์ƒํƒœ๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ๋ณ€๊ฒฝํ•˜๊ณ  ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

 

 

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

 

// ํ•จ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ณ ์ฐจ ํ•จ์ˆ˜
// ์นด์šดํŠธ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•œ ์ž์œ  ๋ณ€์ˆ˜ counter๋ฅผ ๊ธฐ์–ตํ•˜๋Š” ํด๋กœ์ €๋ฅผ ๋ฐ˜ํ™˜
const couter = (function () {
    // ์นด์šดํŠธ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•œ ์ž์œ  ๋ณ€์ˆ˜
    let counter = 0;

    // ํ•จ์ˆ˜๋ฅผ ์ธ์ˆ˜๋กœ ์ „๋‹ฌ๋ฐ›๋Š” ํด๋กœ์ €๋ฅผ ๋ฐ˜ํ™˜
    return function (aux) {
        // ์ธ์ˆ˜๋กœ ์ „๋‹ฌ๋ฐ›์€ ๋ณด์กฐ ํ•จ์ˆ˜์— ์ƒํƒœ ๋ณ€๊ฒฝ์„ ์œ„์ž„
        counter = aux(counter);
        return counter;
    };
}());

// ๋ณด์กฐ ํ•จ์ˆ˜
function increase(n) {
    return ++n;
}

// ๋ณด์กฐ ํ•จ์ˆ˜
function decrease(n) {
    return --n;
}

// ๋ณด์กฐ ํ•จ์ˆ˜๋ฅผ ์ „๋‹ฌํ•˜์—ฌ ํ˜ธ์ถœ
console.log(counter(increase)); // 1
console.log(counter(increase)); // 2

// ์ž์œ  ๋ณ€์ˆ˜๋ฅผ ๊ณต์œ ํ•จ
console.log(counter(decrease)); // 1
console.log(counter(decrease)); // 0

 

์œ„ ์˜ˆ์ œ์ฒ˜๋Ÿผ ๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝ์„ ๊ณต์œ ํ•˜๋Š” ํด๋กœ์ €๋ฅผ ๋งŒ๋“ค์–ด ์—ฐ๋™ํ•˜์—ฌ ์ฆ๊ฐ์ด ๊ฐ€๋Šฅํ•œ ์นด์šดํ„ฐ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


์บก์Šํ™”์™€ ์ •๋ณด ์€๋‹‰

์บก์Šํ™”๋ฅผ ํ†ตํ•ด ์ •๋ณด ์€๋‹‰์„ ํ•˜๋ฉด ์ ์ ˆ์น˜ ๋ชปํ•œ ์ ‘๊ทผ์œผ๋กœ๋ถ€ํ„ฐ ๊ฐ์ฒด์˜ ์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•ด ์ •๋ณด๋ฅผ ๋ณดํ˜ธํ•˜๊ณ , ๊ฐ์ฒด ๊ฐ„์˜ ์ƒํ˜ธ ์˜์กด์„ฑ(๊ฒฐํ•ฉ๋„)๋ฅผ ๋‚ฎ์ถ”๋Š” ํšจ๊ณผ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์บก์Šํ™” : ๊ฐ์ฒด์˜ ์ƒํƒœ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ํ”„๋กœํผํ‹ฐ๋ฅผ ์ฐธ์กฐํ•˜๊ณ  ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ๋Š” ๋™์ž‘์ธ ๋ฉ”์„œ๋“œ๋ฅผ ํ•˜๋‚˜๋กœ ๋ฌถ๋Š” ๊ฒƒ
  • ์ •๋ณด ์€๋‹‰ : ์บก์Šํ™”๋ฅผ ํ†ตํ•ด ๊ฐ์ฒด์˜ ํŠน์ • ํ”„๋กœํผํ‹ฐ๋‚˜ ๋ฉ”์†Œ๋“œ๋ฅผ ๊ฐ์ถœ ๋ชฉ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ

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

 

ํ•˜์ง€๋งŒ, ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋„ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํŒจํ„ด์„ ํ†ตํ•ด ์ •๋ณด ์€๋‹‰์ด ๊ฐ€๋Šฅํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๊ฒŒ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

const Person = (function () {
    let _age = 0; // private

    // ์ƒ์„ฑ์ž ํ•จ์ˆ˜
    function Person(name, age) {
        this.name = name; // public
        _age = age;
    }
    
    // ํ”„๋กœํ† ํƒ€์ž… ๋ฉ”์„œ๋“œ
    Person.prototype.sayHi = function () {
    	console.log(`Hi! My name is ${this.name}. I am ${_age}.`);
    };
    
    // ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜
    return Person;
}());

const me = new Person('Lee', 20);
me.sayHi(); // Hi! My name is Lee. I am 20.
console.log(me.name); // Lee
console.log(me._age); // undefined

const you = new Person('Kim', 30);
you.sayHi(); // Hi! My name is Kim. I am 30.
console.log(me.name); // Kim
console.log(me._age); // undefined

 

์œ„ ์˜ˆ์ œ์˜ _age ๋ณ€์ˆ˜๋Š” Person ์ƒ์„ฑ์ž ํ•จ์ˆ˜์˜ ์ง€์—ญ ๋ณ€์ˆ˜์ด๋ฏ€๋กœ Person ์ƒ์„ฑ์ž ํ•จ์ˆ˜ ์™ธ๋ถ€์—์„œ ์ฐธ์กฐ/๋ณ€๊ฒฝ ํ•  ์ˆ˜ ์—†์–ด privateํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ, Person.prototype.sayHi ๋ฉ”์„œ๋“œ๋Š” ์ฆ‰์‹œ ์‹คํ–‰ ํ•จ์ˆ˜๊ฐ€ ์ข…๋ฃŒ๋œ ์ดํ›„ ํ˜ธ์ถœ๋˜์ง€๋งŒ Person ์ƒ์„ฑ์ž ํ•จ์ˆ˜์™€ sayHi ๋ฉ”์„œ๋“œ๋Š” ์ด๋ฏธ ์ข…๋ฃŒ๋˜์–ด ์†Œ๋ฉธํ•œ ์ฆ‰์‹œ ์‹คํ–‰ ํ•จ์ˆ˜์˜ ์ง€์—ญ ๋ณ€์ˆ˜ _age๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋Š” ํด๋กœ์ €์ž…๋‹ˆ๋‹ค.

 

Person.prototype.sayHi ๋ฉ”์„œ๋“œ๋Š” ๋‹จ ํ•œ๋ฒˆ ์ƒ์„ฑ๋˜๋Š” ํด๋กœ์ €์ด๊ธฐ ๋•Œ๋ฌธ์— Person ์ƒ์„ฑ์ž ํ•จ์ˆ˜๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•  ๊ฒฝ์šฐ _age๋ณ€์ˆ˜์˜ ์ƒํƒœ๊ฐ€ ์œ ์ง€๋˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.

 

์ด์ฒ˜๋Ÿผ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ์ •๋ณด ์€๋‹‰์„ ์™„์ „ํ•˜๊ฒŒ๋Š” ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.


[์ถœ์ฒ˜] ๋ชจ๋˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ Deep Dive

https://wikibook.co.kr/mjs/

 

๋ชจ๋˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ Deep Dive: ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ๊ธฐ๋ณธ ๊ฐœ๋…๊ณผ ๋™์ž‘ ์›๋ฆฌ

269๊ฐœ์˜ ๊ทธ๋ฆผ๊ณผ ์›๋ฆฌ๋ฅผ ํŒŒํ—ค์น˜๋Š” ์„ค๋ช…์œผ๋กœ ‘์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ๊ธฐ๋ณธ ๊ฐœ๋…๊ณผ ๋™์ž‘ ์›๋ฆฌ’๋ฅผ ์ดํ•ดํ•˜์ž! ์›นํŽ˜์ด์ง€์˜ ๋‹จ์ˆœํ•œ ๋ณด์กฐ ๊ธฐ๋Šฅ์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ์ œํ•œ์ ์ธ ์šฉ๋„๋กœ ํƒœ์–ด๋‚œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ๊ณผ๋„

wikibook.co.kr