all is well!!

5. ํด๋กœ์ € ๋ณธ๋ฌธ

Javascript ๊ณต๋ถ€

5. ํด๋กœ์ €

tnqlscho 95 2023. 5. 9. 13:50

๐Ÿ‘€ ํด๋กœ์ €๋ž€ ?

  1. ํด๋กœ์ €๋Š” ๋‚ด๋ถ€ ํ•จ์ˆ˜๊ฐ€ ์™ธ๋ถ€ ํ•จ์ˆ˜๋ณด๋‹ค ๋” ์˜ค๋ž˜ ์œ ์ง€ ๋˜์—ˆ์„๋•Œ, ์™ธ๋ถ€ ํ•จ์ˆ˜๊ฐ€ ์ข…๋ฃŒ๋œ ํ›„์—๋„ ์™ธ๋ถ€ ํ•จ์ˆ˜์˜ ๋ณ€์ˆ˜๋ฅผ ๋‚ด๋ถ€ ํ•จ์ˆ˜์—์„œ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋Š” ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค.
  2. ํด๋กœ์ €๊ฐ€ ๋ณ€์ˆ˜๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋Š” ์ด์œ ๋Š” ์‹คํ–‰ ์ปจํ…์ŠคํŠธ์˜ Lexical Environment์™€ ๊ด€๋ จ์ด ์žˆ์Šต๋‹ˆ๋‹ค. Lexical Environment๋Š” ๋ณ€์ˆ˜๋‚˜ ํ•จ์ˆ˜ ์„ ์–ธ์„ ์ €์žฅํ•˜๋Š” Environment Record์™€, ์™ธ๋ถ€ ํ•จ์ˆ˜์˜ Lexical Environment๋ฅผ ์ฐธ์กฐํ•˜๋Š” Outer Environment Reference๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ์Šต๋‹ˆ๋‹ค. ๋•๋ถ„์— ์™ธ๋ถ€ ํ•จ์ˆ˜๊ฐ€ ์ข…๋ฃŒ๋œ ํ›„์—๋„ ๋‚ด๋ถ€ ํ•จ์ˆ˜๋Š” ์™ธ๋ถ€ ํ•จ์ˆ˜์˜ ๋ณ€์ˆ˜๋ฅผ ์ง€์†์ ์œผ๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋•Œ ์ฐธ์กฐ๋œ ๋ณ€์ˆ˜๋Š” ํž™ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅ๋˜์–ด ์œ ์ง€๋ฉ๋‹ˆ๋‹ค.
  3. ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋  ๋•Œ๋งˆ๋‹ค ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๊ฐ€ ์ƒ์„ฑ๋˜์–ด ์Šคํƒ์— ์Œ“์ด๊ณ , ํด๋กœ์ €๋„ ์ด ๊ณผ์ •์—์„œ ํ™œ์„ฑํ™” ๋ฉ๋‹ˆ๋‹ค.

 

๐Ÿ”ต ์žฅ์ 

1. ์›ํ•˜๋Š” ์ •๋ณด(๋ณ€์ˆ˜)๋ฅผ ์€๋‹‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

function createCounter() {

  let count = 0;

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

  function decrement() {
    count--;
    console.log(count);
  }

  return {
    increment: increment,
    decrement: decrement
  };
}

console.log(count); // ์ ‘๊ทผ ๋ถˆ๊ฐ€๋Šฅ

๋ฉ”์„œ๋“œ๋“ค์€ ์™ธ๋ถ€ ํ•จ์ˆ˜์˜ ๋ณ€์ˆ˜์ธ count ๋ณ€์ˆ˜๋ฅผ ๊ณ„์† ์ฐธ์กฐํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ํž™ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์ ‘๊ทผ๊ณผ ์ˆ˜์ •์ด ๊ฐ€๋Šฅํ•˜๊ณ  ์™ธ๋ถ€์—์„œ count ๋ณ€์ˆ˜์— ์ง์ ‘์ ์œผ๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

count ๋ณ€์ˆ˜๋Š” ์˜ค์ง increment()์™€ decrement()๋ฅผ ํ†ตํ•ด์„œ๋งŒ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

 

 

2. ๋ชจ๋“ˆํ™”๋ฅผ ํ†ตํ•ด ์€๋‹‰์ด ํ•„์š”ํ•œ ์ •๋ณด๋“ค์€ ํ•จ์ˆ˜ ์•ˆ์— ์ˆจ๊ธฐ๊ณ , ํ•„์š”ํ•œ ๊ธฐ๋Šฅ๋งŒ ํ•จ์ˆ˜ ์™ธ๋ถ€๋กœ ๋…ธ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

const counter = (function counterIIFE(){
  let count = 0;

  return {
    getCounter: function () { 
        return count;
    },

    incrementCount: function () { 
        count++;
        return count;
    },

    decrementCount: function () {
        count--;
        return count;
    }
  }
})();

counter.getCounter() // 0
counter.incrementCount() // 1
counter.incrementCount() // 2
counter.decrementCount() // 1
counter.getCounter() // 1

ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ–ˆ์„๋•Œ ๋™์‹œ์— ํ˜ธ์ถœ๋˜๋Š” IIFE(์ฆ‰์‹œ ์‹คํ–‰ ํ•จ์ˆ˜ ํ‘œํ˜„์‹)์„ ์ด์šฉํ•ด์„œ counter์—์„œ counterIIFE๊ฐ€ ์‹คํ–‰ํ•˜๋ฉด์„œ ๊ฐ์ฒด๊ฐ€ ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค. ๊ทธ ํ›„์—๋Š” getCounter, incrementCount, decrementCount ๋ฉ”์†Œ๋“œ๋ฅผ ํ†ตํ•ด์„œ๋งŒ count ๋ณ€์ˆ˜์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์œ„์˜ ํŒจํ„ด์„ ํ†ตํ•ด ๋ชจ๋“ˆํ™”์—์„œ ํ•„์š”ํ•œ ์ž‘์€ ๋‹จ์œ„์˜ ๋…๋ฆฝ์ ์ธ ๊ธฐ๋Šฅ, ์žฌ์‚ฌ์šฉ์„ฑ, ์บก์Аํ™”, ์œ ์ง€๋ณด์ˆ˜์˜ ์žฅ์ ๋“ค์„ ๊ฐ€์ ธ๊ฐˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

3. ์ƒํƒœ ์œ ์ง€๊ฐ€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

function createAdder(x) {
  return function (y) {
    return x + y;
  };
}

const initAdd = createAdder(3);
initAdd(2) // 5
initAdd(8) // 11

ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํŒจํ„ด ์ค‘ ํ•˜๋‚˜์ธ currying ํŒจํ„ด๊ณผ ํด๋กœ์ €๋ฅผ ํ†ตํ•ด์„œ ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋  ๋•Œ๋งˆ๋‹ค ์ธ์ž๊ฐ’ x์˜ ์ƒํƒœ ์œ ์ง€๊ฐ€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

์ธ์ž๋Š” ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ ๋ณ€์ˆ˜๋กœ ์ทจ๊ธ‰๋˜๊ธฐ ๋•Œ๋ฌธ์— ํด๋กœ์ €๋กœ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

๐Ÿ”ด ๋‹จ์ 

1. ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๊ฐ€ ๋ฐœ์ƒํ•  ์œ„ํ—˜์ด ์žˆ์Šต๋‹ˆ๋‹ค.

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

2. ๋””๋ฒ„๊น…์ด ๊นŒ๋‹ค๋กœ์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

 

 


24๋…„ 10์›” ์—…๋ฐ์ดํŠธ

 

Comments