Home 24์žฅ, ํด๋กœ์ €
Post
์ทจ์†Œ

24์žฅ, ํด๋กœ์ €

๐Ÿ”– 24์žฅ, ํด๋กœ์ €

๐Ÿ“Œ ๋ฐฐ์šด ๋‚ด์šฉ ๋ฐ ๊ธฐ์–ตํ•˜๊ณ  ์‹ถ์€ ๋‚ด์šฉ

ํด๋กœ์ €๋Š” ํ•จ์ˆ˜๋ฅผ ์ผ๊ธ‰ ๊ฐ์ฒด๋ฅผ ์ทจ๊ธ‰ํ•˜๋Š” ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์—์„œ ์‚ฌ์šฉ๋˜๋Š” ์ค‘์š”ํ•œ ํŠน์„ฑ์ด๋‹ค.

MDN์—์„œ ํด๋กœ์ €์˜ ์ •์˜

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

โ€œ๊ทธ ํ•จ์ˆ˜๊ฐ€ ์„ ์–ธ๋œ ๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝโ€: ์ƒ์œ„ ์Šค์ฝ”ํ”„๊ฐ€ ์˜๋ฏธํ•˜๋Š” ์‹คํ–‰ ์ปจํ…์ŠคํŠธ์˜ ๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝ์„ ์˜๋ฏธ

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

  • ๋ ‰์‹œ์ปฌ ์Šค์ฝ”ํ”„(์ •์  ์Šค์ฝ”ํ”„): ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์—์„œ ํ•จ์ˆ˜๋ฅผ ์–ด๋””์— ์ •์˜ํ–ˆ๋Š”์ง€์— ๋”ฐ๋ผ ์ƒ์œ„์Šค์ฝ”ํ”„๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ๊ฒƒ
  • ์Šค์ฝ”ํ”„ ์ฒด์ธ: ๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝ์—์„œ โ€œ์™ธ๋ถ€ ๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝ์— ๋Œ€ํ•œ ์ฐธ์กฐโ€๋ฅผ ํ†ตํ•ด ์ƒ์œ„ ๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝ๊ณผ ์—ฐ๊ฒฐ๋˜๋Š” ๊ฒƒ
  • ํ•จ์ˆ˜์˜ ์ƒ์œ„ ์Šค์ฝ”ํ”„๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ๊ฒƒ === โ€œ๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝ์˜ ์™ธ๋ถ€ ๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝ์— ๋Œ€ํ•œ ์ฐธ์กฐ์— ์ €์žฅํ•  ์ฐธ์กฐ๊ฐ’์„ ๊ฒฐ์ •ํ•˜๋Š” ๊ฒƒโ€

๋ ‰์‹œ์ปฌ ์Šค์ฝ”ํ”„: ์ƒ์œ„ ์Šค์ฝ”ํ”„์— ๋Œ€ํ•œ ์ฐธ์กฐ๋Š” ํ•จ์ˆ˜๊ฐ€ ์ •์˜๋˜๋Š” ์‹œ์ ์— ํ•จ์ˆ˜๊ฐ€ ์ •์˜๋œ ํ™˜๊ฒฝ์— ์˜ํ•ด ๊ฒฐ์ •๋˜๋Š” ๊ฒƒ

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

๋ ‰์‹œ์ปฌ ์Šค์ฝ”ํ”„๊ฐ€ ๊ฐ€๋Šฅํ•˜๋ ค๋ฉด ์ƒ์œ„์Šค์ฝ”ํ”„๋ฅผ ๊ธฐ์–ตํ•ด์•ผํ•œ๋‹ค(ํ•จ์ˆ˜ ์ •์˜๊ฐ€ ์œ„์น˜ํ•˜๋Š” ์Šค์ฝ”ํ”„)

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

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

์ž์‹ ์ด ํ˜ธ์ถœ๋˜์—ˆ์„ ๋•Œ ์ƒ์„ฑ๋  ํ•จ์ˆ˜ ๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝ์˜ โ€œ์™ธ๋ถ€ ๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝ์— ๋Œ€ํ•œ ์ฐธ์กฐโ€์— ์ €์žฅ๋  ์ฐธ์กฐ๊ฐ’์ด๋‹ค. ํ•จ์ˆ˜ ๊ฐ์ฒด๋Š” ๋‚ด๋ถ€ ์Šฌ๋กฏ [[envirorment]]์— ์ €์žฅํ•œ ๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝ์˜ ์ฐธ์กฐ. ์ฆ‰ ์ƒ์œ„ ์Šค์ฝ”ํ”„๋ฅผ ์ž์‹ ์ด ์กด์žฌํ•˜๋Š” ํ•œ ๊ธฐ์–ตํ•œ๋‹ค

์ฝ”๋“œ ์˜ˆ์‹œ
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
const x = 1;

function foo() {
  const x = 10;

  // ์ƒ์œ„ ์Šค์ฝ”ํ”„๋Š” ํ•จ์ˆ˜ ์ •์˜ ํ™˜๊ฒฝ(์œ„์น˜)์— ๋”ฐ๋ผ ๊ฒฐ์ •๋œ๋‹ค.
  // ํ•จ์ˆ˜ ํ˜ธ์ถœ ์œ„์น˜์™€ ์ƒ์œ„ ์Šค์ฝ”ํ”„๋Š” ์•„๋ฌด๋Ÿฐ ๊ด€๊ณ„๊ฐ€ ์—†๋‹ค.
  bar();
}

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

foo(); // ?
bar(); // ?

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

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

์ฝ”๋“œ ์˜ˆ์‹œ
1
2
3
4
5
6
7
8
9
10
11
12
13
const x = 1;

// โ‘ 
function outer() {
  const x = 10; // ์ž์œ ๋ณ€์ˆ˜ x
  const inner = function () { console.log(x); }; // โ‘ก
  return inner;
}

// outer ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ์ค‘์ฒฉ ํ•จ์ˆ˜ inner๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
// ๊ทธ๋ฆฌ๊ณ  outer ํ•จ์ˆ˜์˜ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๋Š” ์‹คํ–‰ ์ปจํ…์ŠคํŠธ ์Šคํƒ์—์„œ ํŒ๋˜์–ด ์ œ๊ฑฐ๋œ๋‹ค.
const innerFunc = outer(); // โ‘ข
innerFunc(); // โ‘ฃ 10

inner ํ•จ์ˆ˜๋Š” ์ž์‹ ์ด ํ‰๊ฐ€๋  ๋•Œ ์ž์‹ ์ด ์ •์˜๋œ ์œ„์น˜์— ์˜ํ•ด ๊ฒฐ์ •๋œ ์ƒ์œ„ ์Šค์ฝ”ํ”„๋ฅผ [[Environment]] ๋‚ด๋ถ€ ์Šฌ๋กฏ์— ์ €์žฅํ•œ๋‹ค.

์ €์žฅ๋œ ์ƒ์œ„ ์Šค์ฝ”ํ”„๋Š” ํ•จ์ˆ˜๊ฐ€ ์กด์žฌํ•˜๋Š” ํ•œ ์œ ์ง€๋œ๋‹ค.

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

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

ํด๋กœ์ € === โ€œ์ž์œ ๋ณ€์ˆ˜์— ๋ฌถ์—ฌ ์žˆ๋Š” ํ•จ์ˆ˜โ€

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

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

ํด๋กœ์ €์˜ ์ข‹์ง€ ์•Š์€ ์˜ˆ์‹œ ์ฝ”๋“œ
1
2
3
4
5
6
7
8
9
10
11
12
// ์นด์šดํŠธ ์ƒํƒœ ๋ณ€์ˆ˜
let num = 0;

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

console.log(increase()); // 1
console.log(increase()); // 2
console.log(increase()); // 3
ํด๋กœ์ €์˜ ์ข‹์€ ์˜ˆ์‹œ ์ฝ”๋“œ
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// ์นด์šดํŠธ ์ƒํƒœ ๋ณ€๊ฒฝ ํ•จ์ˆ˜
const increase = (function () {
  // ์นด์šดํŠธ ์ƒํƒœ ๋ณ€์ˆ˜
  let num = 0;

  // ํด๋กœ์ €
  return function () {
    // ์นด์šดํŠธ ์ƒํƒœ๋ฅผ 1๋งŒํผ ์ฆ๊ฐ€ ์‹œํ‚จ๋‹ค.
    return ++num;
  };
}());

console.log(increase()); // 1
console.log(increase()); // 2
console.log(increase()); // 3
ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํด๋กœ์ € ํ™œ์šฉ ์˜ˆ์‹œ ์ฝ”๋“œ
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
// ํ•จ์ˆ˜๋ฅผ ์ธ์ˆ˜๋กœ ์ „๋‹ฌ๋ฐ›๊ณ  ํ•จ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ณ ์ฐจ ํ•จ์ˆ˜
// ์ด ํ•จ์ˆ˜๋Š” ์นด์šดํŠธ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•œ ์ž์œ  ๋ณ€์ˆ˜ counter๋ฅผ ๊ธฐ์–ตํ•˜๋Š” ํด๋กœ์ €๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
function makeCounter(aux) {
  // ์นด์šดํŠธ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•œ ์ž์œ  ๋ณ€์ˆ˜
  let counter = 0;

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

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

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

// ํ•จ์ˆ˜๋กœ ํ•จ์ˆ˜๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.
// makeCounter ํ•จ์ˆ˜๋Š” ๋ณด์กฐ ํ•จ์ˆ˜๋ฅผ ์ธ์ˆ˜๋กœ ์ „๋‹ฌ๋ฐ›์•„ ํ•จ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค
const increaser = makeCounter(increase); // โ‘ 
console.log(increaser()); // 1
console.log(increaser()); // 2

// increaser ํ•จ์ˆ˜์™€๋Š” ๋ณ„๊ฐœ์˜ ๋…๋ฆฝ๋œ ๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝ์„ ๊ฐ–๊ธฐ ๋•Œ๋ฌธ์— ์นด์šดํ„ฐ ์ƒํƒœ๊ฐ€ ์—ฐ๋™ํ•˜์ง€ ์•Š๋Š”๋‹ค.
const decreaser = makeCounter(decrease); // โ‘ก
console.log(decreaser()); // -1
console.log(decreaser()); // -2

makeCounter ํ•จ์ˆ˜๋Š” ๋ณด์กฐ ํ•จ์ˆ˜๋ฅผ ์ธ์ž๋กœ ์ „๋‹ฌ๋ฐ›๊ณ  ํ•จ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ณ ์ฐจํ•จ์ˆ˜๋‹ค.

makeCounter ํ•จ์ˆ˜๊ฐ€ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜๋Š” ์ž์‹ ์ด ์ƒ์„ฑ๋์„ ๋•Œ์˜ ๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝ์ธ makeCounter ํ•จ์ˆ˜์˜ ์Šค์ฝ”ํ”„์— ์†ํ•œ counter ๋ณ€์ˆ˜๋ฅผ ๊ธฐ์–ตํ•˜๋Š” ํด๋กœ์ €๋‹ค.

makeCounter ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•ด ํ•จ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•  ๋•Œ ๋ฐ˜ํ™˜๋œ ํ•จ์ˆ˜๋Š” ์ž์‹ ๋งŒ์˜ ๋…๋ฆฝ๋œ ๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝ์„ ๊ฐ–๋Š”๋‹ค.

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

๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝ์„ ๊ณต์œ ํ•˜๋Š” ํด๋กœ์ € ํ™œ์šฉ ์˜ˆ์‹œ ์ฝ”๋“œ
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
// ํ•จ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ณ ์ฐจ ํ•จ์ˆ˜
// ์ด ํ•จ์ˆ˜๋Š” ์นด์šดํŠธ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•œ ์ž์œ  ๋ณ€์ˆ˜ counter๋ฅผ ๊ธฐ์–ตํ•˜๋Š” ํด๋กœ์ €๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
const counter = (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

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

์บก์Šํ™”(encapsulation): ์ƒํƒœ์™€ ๋™์ž‘์„ ํ•˜๋‚˜๋กœ ๋ฌถ๋Š” ๊ฒƒ์„ ์˜๋ฏธ

์บก์Šํ™”๋Š” ๊ฐ์ฒด์˜ ํŠน์ • ํ”„๋กœํผํ‹ฐ๋‚˜ ๋ฉ”์„œ๋“œ๋ฅผ ๊ฐ์ถœ ๋ชฉ์ ์œผ๋กœ ์‚ฌ์šฉ === ์ •๋ณด ์€๋‹‰

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

์˜ˆ์ œ ์ฝ”๋“œ
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
function Person(name, age) {
  this.name = name; // public
  let _age = age;   // private

  // ์ธ์Šคํ„ด์Šค ๋ฉ”์„œ๋“œ
  this.sayHi = function () {
    console.log(`Hi! My name is ${this.name}. I am ${_age}.`);
  };
}

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(you.name); // Kim
console.log(you._age); // undefined

_age ๋ณ€์ˆ˜๋Š” privateํ•˜๋‹ค.

์œ„ ์˜ˆ์ œ๋Š” Person ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋  ๋•Œ๋งˆ๋‹ค sayHi ๋ฉ”์„œ๋“œ๊ฐ€ ์ค‘๋ณต์ƒ์„ฑ๋œ๋‹ค.

๋ฉ”์„œ๋“œ์˜ ์ค‘๋ณต ์ƒ์„ฑ์ด ๋˜์ง€์•Š์€ ์˜ˆ์ œ ์ฝ”๋“œ
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
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(you.name); // Kim
console.log(you._age); // undefined

Person.prototype.sayHi ๋ฉ”์„œ๋“œ๋Š” ์ฆ‰์‹œ ์‹คํ–‰ ํ•จ์ˆ˜๊ฐ€ ์ข…๋ฃŒ๋œ ์ดํ›„ ํ˜ธ์ถœ๋œ๋‹ค.

ํด๋กœ์ €์ด๊ธฐ ๋•Œ๋ฌธ์— _age๋ฅผ ์ฐธ์กฐ ํ•  ์ˆ˜ ์žˆ๋‹ค.

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

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ์™„์ „ํ•œ ์ •๋ณด ์€๋‹‰์„ ์ง€์›ํ•˜์ง€ ์•Š๋Š”๋‹ค.

6. ์ž์ฃผ ๋ฐœ์ƒํ•˜๋Š” ์‹ค์ˆ˜

ํด๋กœ์ € ์‹ค์ˆ˜ ์˜ˆ์ œ ์ฝ”๋“œ
1
2
3
4
5
6
7
8
9
var funcs = [];

for (var i = 0; i < 3; i++) {
  funcs[i] = function () { return i; }; // โ‘ 
}

for (var j = 0; j < funcs.length; j++) {
  console.log(funcs[j]()); // โ‘ก
}

0, 1, 2๊ฐ€ ๋ฐ˜ํ™˜ ๋˜์ง€์•Š๊ณ  3, 3, 3์ด ์ถœ๋ ฅ๋œ๋‹ค.

for ๋ฌธ์˜ ๋ณ€์ˆ˜ ์„ ์–ธ๋ฌธ์—์„œ var ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•œ i ๋ณ€์ˆ˜๋Š” ์ „์—ญ ๋ณ€์ˆ˜์ด๋‹ค. ์ „์—ญ ๋ณ€์ˆ˜ i์—๋Š” 0, 1, 2๊ฐ€ ์ˆœ์ฐจ์ ์œผ๋กœ ํ• ๋‹น๋œ๋‹ค. ๋”ฐ๋ผ์„œ funcs ๋ฐฐ์—ด์˜ ์š”์†Œ๋กœ ์ถ”๊ฐ€ํ•œ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ์ „์—ญ ๋ณ€์ˆ˜ i๋ฅผ ์ฐธ์กฐํ•˜์—ฌ i์˜ ๊ฐ’์€ 3์ด ์ถœ๋ ฅ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

ํด๋กœ์ €๋ฅผ ์‚ฌ์šฉํ•œ ์˜ฌ๋ฐ”๋ฅธ ์˜ˆ์ œ ์ฝ”๋“œ
1
2
3
4
5
6
7
8
9
10
11
12
13
var funcs = [];

for (var i = 0; i < 3; i++){
  funcs[i] = (function (id) { // โ‘ 
    return function () {
      return id;
    };
  }(i));
}

for (var j = 0; j < funcs.length; j++) {
  console.log(funcs[j]());
}

์ฆ‰์‹œ ์‹คํ–‰ ํ•จ์ˆ˜์˜ ๋งค๊ฐœ๋ณ€์ˆ˜ id๋Š” ์ฆ‰์‹œ ์‹คํ–‰ ํ•จ์ˆ˜๊ฐ€ ๋ฐ˜ํ™˜ํ•œ ์ค‘์ฒฉ ํ•จ์ˆ˜์˜ ์ƒ์œ„ ์Šค์ฝ”ํ”„์— ์กด์žฌํ•œ๋‹ค.

for ๋ฌธ์˜ ๋ณ€์ˆ˜ ์„ ์–ธ๋ฌธ์—์„œ var ํ‚ค์›Œ๋“œ๋กœ ์„ ์–ธํ•œ ๋ณ€์ˆ˜๊ฐ€ ์ „์—ญ๋ณ€์ˆ˜๊ฐ€ ๋˜์–ด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

ํด๋กœ์ €์— let ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•œ ์˜ฌ๋ฐ”๋ฅธ ์˜ˆ์ œ ์ฝ”๋“œ
1
2
3
4
5
6
7
8
9
const funcs = [];

for (let i = 0; i < 3; i++) {
  funcs[i] = function () { return i; };
}

for (let i = 0; i < funcs.length; i++) {
  console.log(funcs[i]()); // 0 1 2
}

for ๋ฌธ์˜ ๋ณ€์ˆ˜ ์„ ์–ธ๋ฌธ์—์„œ let ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด for ๋ฌธ์˜ ์ฝ”๋“œ ๋ธ”๋ก์ด ๋ฐ˜๋ณต ์‹คํ–‰๋  ๋•Œ ๋งˆ๋‹ค for ๋ฌธ ์ฝ”๋“œ ๋ธ”๋ก์˜ ์ƒˆ๋กœ์šด ๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝ์ด ์ƒ์„ฑ๋œ๋‹ค.

for ๋ฌธ์ด ๋ฐ˜๋ณต๋  ๋•Œ๋งˆ๋‹ค ๋…๋ฆฝ์ ์ธ ๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝ์„ ์ƒ์„ฑํ•˜์—ฌ ์‹๋ณ„์ž์˜ ๊ฐ’์„ ์œ ์ง€ํ•œ๋‹ค.

์ฝ”๋“œ ๋ธ”๋ก ๋‚ด์—์„œ ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•  ๋•Œ ์˜๋ฏธ๊ฐ€ ์žˆ๋‹ค.

๊ณ ์ฐจํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•œ ์˜ˆ์ œ ์ฝ”๋“œ
1
2
3
4
5
6
// ์š”์†Œ๊ฐ€ 3๊ฐœ์ธ ๋ฐฐ์—ด์„ ์ƒ์„ฑํ•˜๊ณ  ๋ฐฐ์—ด์˜ ์ธ๋ฑ์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ์š”์†Œ๋กœ ์ถ”๊ฐ€ํ•œ๋‹ค.
// ๋ฐฐ์—ด์˜ ์š”์†Œ๋กœ ์ถ”๊ฐ€๋œ ํ•จ์ˆ˜๋“ค์€ ๋ชจ๋‘ ํด๋กœ์ €๋‹ค.
const funcs = Array.from(new Array(3), (_, i) => () => i); // (3) [ฦ’, ฦ’, ฦ’]

// ๋ฐฐ์—ด์˜ ์š”์†Œ๋กœ ์ถ”๊ฐ€๋œ ํ•จ์ˆ˜ ๋“ค์„ ์ˆœ์ฐจ์ ์œผ๋กœ ํ˜ธ์ถœํ•œ๋‹ค.
funcs.forEach(f => console.log(f())); // 0 1 2

๋ณ€์ˆ˜์™€ ๋ฐ˜๋ณต๋ฌธ์˜ ์‚ฌ์šฉ์„ ์–ต์ œํ•˜์—ฌ ์˜ค๋ฅ˜๋ฅผ ์ค„์ด๊ณ  ๊ฐ€๋…์„ฑ์„ ์ข‹๊ฒŒ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์ธ ๊ณ ์ฐจํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ‘ผ ์˜ˆ์ œ ์ฝ”๋“œ์ด๋‹ค.

โ—๏ธ ์ฝ์€ ์†Œ๊ฐ

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

โ“ ๊ถ๊ธˆํ•œ ๋‚ด์šฉ์ด๋‚˜ ์ž˜ ์ดํ•ด๋˜์ง€ ์•Š๋Š” ๋‚ด์šฉ

  • const funcs = Array.from(new Array(3), (_, i) => () => i); ์—์„œ _์˜ ์˜๋ฏธ
    • ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์ธ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ _์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๊ด€๋ก€
This post is licensed under CC BY 4.0 by the author.

์ ์˜ ์œ„์น˜ ๊ตฌํ•˜๊ธฐ

๋กœ๊ทธ์ธ ํ™”๋ฉด ๊ตฌํ˜„ํ•˜๊ธฐ