Hello Kitty Eyes Shut
๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๐Ÿ’ป๊ณต๋ถ€ ๊ธฐ๋ก/๐Ÿ“Œ ๋ฆฌ์•กํŠธ ๊ธฐ์ดˆ ์Šคํ„ฐ๋””

[๋ฆฌ์•กํŠธ ๊ธฐ์ดˆ ์Šคํ„ฐ๋””] JavaScript ํด๋กœ์ € (Closuer)

๋ฐ˜์‘ํ˜•

 

 

 

 

 

 

๐Ÿ“‘ JavaScript ํด๋กœ์ €(Closuer)

์•ž์„  ํฌ์ŠคํŒ…์—์„œ ์‚ดํŽด๋ดค๋˜ ๊ฒƒ์ฒ˜๋Ÿผ

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ๋Š” ํ•จ์ˆ˜๊ฐ€ ๋ณ€์ˆ˜๋ฅผ ์ฐพ์„ ๋•Œ ์Šค์ฝ”ํ”„ ์ฒด์ธ์„ ๋”ฐ๋ผ ๋ฐ”๊นฅ์ชฝ๊นŒ์ง€ ๊ฑฐ์Šฌ๋Ÿฌ ์˜ฌ๋ผ๊ฐ€๊ฒŒ ๋œ๋‹ค.

 

(์ด์ „ ํฌ์ŠคํŒ… ์ฐธ๊ณ )

 

[๋ฆฌ์•กํŠธ ๊ธฐ์ดˆ ์Šคํ„ฐ๋””] JavaScript ์Šค์ฝ”ํ”„ ์ฒด์ธ (Scope Chain)

๋ชฉ์ฐจ (OPEN)๐Ÿ“‘ JavaScript ์Šค์ฝ”ํ”„ ์ฒด์ธ (Scope Chain)๐ŸŸฅ ์Šค์ฝ”ํ”„ ์ฒด์ธ์˜ ๊ธฐ๋ณธ ์›๋ฆฌ๐ŸŸง ์˜ˆ์ œ๋กœ ์‚ดํŽด๋ณด๊ธฐ๐Ÿ“š ๊ฒฐ๋ก  ๐Ÿ“‘ JavaScript ์Šค์ฝ”ํ”„ ์ฒด์ธ (Scope Chain)์•ž์„  ํฌ์ŠคํŒ…์—์„œ ์‚ดํŽด๋ดค๋“ฏ์ด, ๋ณ€์ˆ˜์—๋Š” ์ „์—ญ ์Šค์ฝ”ํ”„, ์ง€

sso-codingdiary.tistory.com

 

๊ทธ๋Ÿฐ๋ฐ ์ด๋•Œ ํ•œ ๊ฐ€์ง€ ํŠน๋ณ„ํ•œ ํ˜„์ƒ์ด ์ƒ๊ธฐ๋Š”๋ฐ, ์ด๊ฒŒ ๋ฐ”๋กœ ํด๋กœ์ €(Closuer)์ด๋‹ค.

 

 

๊ฐ„๋žตํ•˜๊ฒŒ ๋งํ•˜์ž๋ฉด ํด๋กœ์ €๋ž€,

ํ•จ์ˆ˜๊ฐ€ ์ž์‹ ์ด ์„ ์–ธ๋  ๋‹น์‹œ์˜ ์Šค์ฝ”ํ”„(ํ™˜๊ฒฝ)๋ฅผ ๊ธฐ์–ตํ•ด์„œ,

๊ทธ ์Šค์ฝ”ํ”„ ๋ฐ”๊นฅ์—์„œ ์‹คํ–‰๋˜๋”๋ผ๋„ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ํ˜„์ƒ์„ ๋งํ•œ๋‹ค.

 

์กฐ๊ธˆ ์–ด๋ ต๊ฒŒ ๋А๊ปด์งˆ ์ˆ˜๋„ ์žˆ๋Š”๋ฐ,

๊ทธ๋ƒฅ 'ํ•จ์ˆ˜๊ฐ€ ํƒœ์–ด๋‚ฌ์„ ๋‹น์‹œ์˜ ์ฃผ๋ณ€ ํ™˜๊ฒฝ์„ ํ‰์ƒ ๊ธฐ์–ตํ•˜๋Š” ๋Šฅ๋ ฅ'์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค.

 

 


๐ŸŸฅ ์˜ˆ์ œ 1) ๊ธฐ๋ณธ์ ์ธ ํด๋กœ์ €

function outer() {
  let count = 0; // outer ํ•จ์ˆ˜์˜ ์ง€์—ญ ๋ณ€์ˆ˜
  
  function inner() {
    count++;
    console.log(count);
  }
  
  return inner; // inner ํ•จ์ˆ˜ ๋ฐ˜ํ™˜
}

count colsuerFunc = outer();

closureFunc(); // 1
closureFunc(); // 2
closureFunc(); // 3

 

์ด ์˜ˆ์ œ ์ฝ”๋“œ์—์„œ ์ผ์–ด๋‚˜๋Š” ์ผ์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

  1. outer() ๊ฐ€ ์‹คํ–‰๋˜๋ฉด์„œ count = 0์ด ์ƒ๊ธฐ๊ณ , inner ํ•จ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  2. closuerFunc์€ inner๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค.
    (outer ํ•จ์ˆ˜๊ฐ€ inner ํ•จ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ–ˆ์œผ๋‹ˆ๊นŒ)
  3. inner ๋ฅผ ์‹คํ–‰ํ•  ๋•Œ๋งˆ๋‹ค count์— ์ ‘๊ทผํ•ด์„œ ๊ฐ’์„ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋‹ค.

 

์—ฌ๊ธฐ์—์„œ ์ฃผ๋ชฉํ•  ์ ์ด, ์›๋ž˜๋ผ๋ฉด outer ์‹คํ–‰์ด ๋๋‚˜๋ฉด count ๋Š” ์‚ฌ๋ผ์ ธ์•ผ ํ•˜๋Š”๋ฐ,

inner ๊ฐ€ count๋ฅผ ๊ณ„์† ๊ธฐ์–ตํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— count ๊ฐ€ ์‚ด์•„๋‚จ๋Š”๋‹ค๋Š” ์ ์ด๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์ด๊ฒŒ ๋ฐ”๋กœ ํด๋กœ์ €์ด๋‹ค.

 

 


๐ŸŸง ์˜ˆ์ œ 2) ํด๋กœ์ € ์—†์ด ๊ตฌํ˜„ํ–ˆ์„ ๋•Œ์™€ ๋น„๊ตํ•ด๋ณด๊ธฐ

let count = 0;

function increase() {
  count++;
  console.log(count);
}

increase(); // 1
increase(); // 2
increase(); // 3

 

์ด๋ ‡๊ฒŒ ํ•ด๋„ ์œ„์˜ ์˜ˆ์ œ 1์—์„œ ๋ดค๋˜ ๊ฒƒ์ฒ˜๋Ÿผ 1 2 3 ์ด ์ถœ๋ ฅ๋˜๊ธฐ๋Š” ํ•˜์ง€๋งŒ,

์ด ์ฝ”๋“œ์—์„œ๋Š” count ๊ฐ€ ์ „์—ญ์— ๋…ธ์ถœ๋˜์–ด ์žˆ๋‹ค.

๋”ฐ๋ผ์„œ ๋ˆ„๊ตฌ๋‚˜ count ๊ฐ’์„ ๋ฐ”๊ฟ”๋ฒ„๋ฆด ์ˆ˜๊ฐ€ ์žˆ๋‹ค๋Š” ์œ„ํ—˜์ด ์žˆ๋‹ค.

 

 

์ด ์ฝ”๋“œ์™€ ์˜ˆ์ œ 1์˜ ์ฝ”๋“œ๋ฅผ ๋น„๊ตํ•ด๋ณด๋ฉด ํด๋กœ์ €์˜ ์žฅ์ ์ด ํ™•์—ฐํžˆ ๋“œ๋Ÿฌ๋‚œ๋‹ค.

๋ฐ”๋กœ, ๋ฐ์ดํ„ฐ ์€๋‹‰๊ณผ ์•ˆ์ „ํ•œ ์ƒํƒœ ๊ด€๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋œ๋‹ค๋Š” ์ ์ด๋‹ค.

(์‹ค์ œ๋กœ ์˜ˆ์ œ 1์˜ ์ฝ”๋“œ์—์„œ๋Š” count ๋ฅผ ์™ธ๋ถ€์—์„œ ์ง์ ‘ ๊ฑด๋“œ๋ฆฌ๋Š” ๊ฒƒ์€ ๋ถˆ๊ฐ€๋Šฅํ•˜๊ณ ,

์˜ค์ง inner ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด์„œ๋งŒ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค๋Š” ๊ฒƒ์„ ๋ณด๋ฉด ์•Œ ์ˆ˜ ์žˆ๋‹ค.)

 

 


๐ŸŸจ ์˜ˆ์ œ 3) ์—ฌ๋Ÿฌ ํด๋กœ์ € ์ธ์Šคํ„ด์Šค

๊ทธ๋ ‡๋‹ค๋ฉด ์ด ์ฝ”๋“œ๋Š” ์–ด๋–จ๊นŒ?

function makeCounter() {
  let num = 0;
  
  return function () {
    num++;
    return num;
  };
}

const counter1 = makeCounter();
const counter2 = makeCounter();

console.log(counter1()); // 1
console.log(counter1()); // 2
console.log(counter2()); // 1 (counter1๊ณผ๋Š” ๋ณ„๊ฐœ๋กœ ๋™์ž‘ํ•จ)

 

์ด ์ฝ”๋“œ์—์„œ๋Š” counter1์—์„œ makeCounter๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ์™€

counter2์—์„œ makeCounter๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ

์„œ๋กœ ๋‹ค๋ฅธ ๋…๋ฆฝ์ ์ธ ํ™˜๊ฒฝ(num)์ด ๋งŒ๋“ค์–ด์ง€๊ฒŒ ๋œ๋‹ค.

 

๊ทธ๋ž˜์„œ ๋‹น์—ฐํžˆ counter1๊ณผ counter2๋Š” ์„œ๋กœ ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๊ฒŒ ๋œ๋‹ค.

 

 

์ด์ฒ˜๋Ÿผ ํด๋กœ์ €๋งˆ๋‹ค ๋…๋ฆฝ์ ์ธ ๊ธฐ์–ต ๊ณต๊ฐ„์„ ๊ฐ€์ง„๋‹ค๋Š” ์ ์€ ๊ต‰์žฅํžˆ ์ค‘์š”ํ•œ ํฌ์ธํŠธ๋‹ค !

 

 


๐ŸŸฉ ์Šค์ฝ”ํ”„ ์ฒด์ธ๊ณผ ํด๋กœ์ €์˜ ๊ด€๊ณ„

๋‚ด๊ฐ€ ์ฒ˜์Œ ์ด ์˜ˆ์‹œ๋“ค๊ณผ ํ•จ๊ป˜ ์Šค์ฝ”ํ”„๋ฅผ ๊ณต๋ถ€ํ•  ๋•,

'์˜ค ~~ ์‹ ๊ธฐํ•˜๋‹ค !!' ํ•˜๋ฉด์„œ ์ญ‰ ๋ณด๊ธด ํ–ˆ๋Š”๋ฐ ..

๋ฌธ๋“ ๋‹ค ๋ณด๊ณ  ๋‚˜๋‹ˆ '๊ทธ๋ž˜์„œ ๊ฒฐ๋ก ์ ์œผ๋กœ ์Šค์ฝ”ํ”„์ฒด์ธ์ด๋ž‘ ํด๋กœ์ €๊ฐ€ ๋ฌด์Šจ ๊ด€๊ณ„๋ผ๋Š” ๊ฑฐ์ง€?' ์‹ถ์—ˆ์—ˆ๋‹ค.

 

๊ทธ๋ž˜์„œ ์ด๋ ‡๊ฒŒ ๋‹ค์‹œ ํ•œ ๋ฒˆ ์š”์•ฝํ•ด์„œ ์ •๋ฆฌํ•ด๋ณด๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

 

 

 

์ผ๋‹จ, ์Šค์ฝ”ํ”„ ์ฒด์ธ์ด๋ผ๋Š” ๊ฒƒ์€ ํ•จ์ˆ˜ ์•ˆ์—์„œ ๋ณ€์ˆ˜๋ฅผ ์ฐพ์„ ๋•Œ

์ž๊ธฐ ์Šค์ฝ”ํ”„ ๐Ÿ‘‰๐Ÿป ๋ฐ”๊นฅ ์Šค์ฝ”ํ”„ ๐Ÿ‘‰๐Ÿป ๊ทธ ๋ฐ”๊นฅ ์Šค์ฝ”ํ”„ ๐Ÿ‘‰๐Ÿป ... ๐Ÿ‘‰๐Ÿป ์ „์—ญ ์Šค์ฝ”ํ”„

์ด๋Ÿฐ ์‹์œผ๋กœ ๋ฐ–์œผ๋กœ๋งŒ ๊ฑฐ์Šฌ๋Ÿฌ ์˜ฌ๋ผ๊ฐ€๋ฉฐ ํƒ์ƒ‰ํ•œ๋‹ค๋Š” ๊ฒƒ์ด์—ˆ๋‹ค.

 

์ฆ‰, ์—ฌ๊ธฐ๊นŒ์ง€์—์„œ์˜ ํ•ต์‹ฌ์€,

ํ•จ์ˆ˜๋Š” ์ž์‹ ์ด ์„ ์–ธ๋  ๋‹น์‹œ์˜ ์Šค์ฝ”ํ”„๋ฅผ ๊ธฐ์–ตํ•œ๋‹ค๋Š” ์ ์ด๋‹ค.

(๊ธฐ์–ต์„ ํ•˜๋‹ˆ๊นŒ ์ž๊ธฐ ์Šค์ฝ”ํ”„๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด์„œ ๋ฐ”๊นฅ ์Šค์ฝ”ํ”„๋กœ ํƒ์ƒ‰์„ ํ•˜๊ฒ ์ฃ ?)

 

 

 

๊ทธ๋Ÿผ ์ด์ œ ํด๋กœ์ €์— ๋Œ€ํ•ด์„œ ๋‹ค์‹œ ์ •๋ฆฌํ•ด๋ณด๋ฉด,

ํ•จ์ˆ˜๊ฐ€ ์„ ์–ธ๋  ๋‹น์‹œ์˜ ์Šค์ฝ”ํ”„๋ฅผ ๊ธฐ์–ตํ•ด์„œ, ๊ทธ ์Šค์ฝ”ํ”„ ๋ฐ”๊นฅ์—์„œ ์‹คํ–‰๋˜๋”๋ผ๋„ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ํ˜„์ƒ์ด์—ˆ๋‹ค.

 

 

๊ทธ๋ž˜์„œ ์•„๊นŒ ๋ดค๋˜ ์˜ˆ์ œ๋ฅผ ๋‹ค์‹œ ๊ฐ€์ ธ์™€์„œ ์„ค๋ช…ํ•˜์ž๋ฉด,

function outer() {
  let count = 0; // outer ํ•จ์ˆ˜์˜ ์ง€์—ญ ๋ณ€์ˆ˜
  
  function inner() {
    count++;
    console.log(count);
  }
  
  return inner; // inner ํ•จ์ˆ˜ ๋ฐ˜ํ™˜
}

count colsuerFunc = outer();

closureFunc(); // 1
closureFunc(); // 2
closureFunc(); // 3

 

  1. inner ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋  ๋•Œ count ๋ณ€์ˆ˜๋ฅผ ์ฐพ๋Š”๋‹ค.
  2. ์ผ๋‹จ ์ž๊ธฐ ์Šค์ฝ”ํ”„์—๋Š” ์—†์œผ๋‹ˆ๊นŒ ์Šค์ฝ”ํ”„ ์ฒด์ธ์„ ๋”ฐ๋ผ outer ์Šค์ฝ”ํ”„๋กœ ์˜ฌ๋ผ๊ฐ„๋‹ค.
  3. ๊ทธ๋ž˜์„œ outer ์˜ ์ง€์—ญ ๋ณ€์ˆ˜์ธ count๋ฅผ ๊ณ„์† ์“ธ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด๋‹ค.

 

์ด์ฒ˜๋Ÿผ, ๋น„๋ก outer() ์˜ ์‹คํ–‰์€ ๋๋‚˜๊ธด ํ–ˆ์ง€๋งŒ,

inner๊ฐ€ outer์˜ ํ™˜๊ฒฝ์„ ์Šค์ฝ”ํ”„ ์ฒด์ธ์œผ๋กœ ๊ธฐ์–ตํ•˜๊ณ  ์žˆ์œผ๋ฏ€๋กœ count๋ฅผ ๊ณ„์† ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด๋‹ค.

 

 

๊ทธ๋ž˜์„œ ๋‹ค๋“ค ํด๋กœ์ €๋Š” ์Šค์ฝ”ํ”„ ์ฒด์ธ์„ ์ด์šฉํ•ด์„œ ๋ฐ”๊นฅ ๋ณ€์ˆ˜๋ฅผ ๊ธฐ์–ตํ•˜๊ณ  ํ™œ์šฉํ•˜๋Š” ๊ฒƒ์ด๋ผ๊ณ  ๋ถ€๋ฅด๋Š” ๊ฑฐ์˜€๋‹ค.

 

 


๐Ÿ“š ๊ฒฐ๋ก 

์ฒ˜์Œ ํด๋กœ์ €์— ๋Œ€ํ•ด์„œ ์•Œ๊ฒŒ ๋์„ ๋•, '์–ด๋–ป๊ฒŒ ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰์ด ๋๋‚˜๋Š”๋ฐ ๋ณ€์ˆ˜๋ฅผ ๊ณ„์† ๊ธฐ์–ตํ•˜์ง€?' ์‹ถ์—ˆ๋Š”๋ฐ,

์•Œ๊ณ ๋ณด๋‹ˆ ์ด๊ฒƒ๋„ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ์Šค์ฝ”ํ”„ ์ฒด์ธ ๋•๋ถ„์— ๊ฐ€๋Šฅํ•œ ํ˜„์ƒ์ด๋ผ๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์—ˆ๋‹ค.

 

ํŠนํžˆ ํด๋กœ์ €๋ฅผ ์ด์šฉํ•˜๋ฉด ์™ธ๋ถ€์—์„œ๋Š” ์ง์ ‘ ์ ‘๊ทผํ•˜์ง€ ๋ชปํ•˜๋Š” ๋น„๋ฐ€์Šค๋Ÿฌ์šด ๋ณ€์ˆ˜๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์ด ๊ฐ€์žฅ ์ธ์ƒ ๊นŠ์—ˆ๋‹ค.

 

์•ž์œผ๋กœ๋Š” ํด๋กœ์ €๋ฅผ ์ด์šฉํ•ด์„œ ์•ˆ์ „ํ•˜๊ฒŒ ์บก์Аํ™”ํ•˜๋Š” ์Šต๊ด€์„ ๋“ค์—ฌ๋„ ์ข‹์„ ๊ฒƒ ๊ฐ™๋‹ค.

๋ฐ˜์‘ํ˜•