Skip to content

Latest commit

ย 

History

History
322 lines (234 loc) ยท 13.5 KB

closer.md

File metadata and controls

322 lines (234 loc) ยท 13.5 KB

ํด๋กœ์ € (Closer)

์ž‘์„ฑ์ž : ์ด์Šฌ๊ธฐ

1. ํด๋กœ์ €๋ฅผ ์ดํ•ดํ•˜๊ธฐ ์ „์— ํ•„์š”ํ•œ ๊ฐœ๋…

1.1 ๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝ

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

  • ๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝ์ด๋ž€, ์‹๋ณ„์ž์™€ ์‹๋ณ„์ž์— ๋ฐ”์ธ๋”ฉ๋œ ๊ฐ’. ๊ทธ๋ฆฌ๊ณ  ์ƒ์œ„ ์Šค์ฝ”ํ”„์— ๋Œ€ํ•œ ์ฐธ์กฐ๋ฅผ ๊ธฐ๋กํ•˜๋Š” ์ž๋ฃŒ๋กœ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ์ด๋‹ค. ์‹คํ–‰ ์ปจํ…์ŠคํŠธ ์Šคํƒ์ด ์ฝ”๋“œ์˜ ์‹คํ–‰ ์ˆœ์„œ๋ฅผ ๊ด€๋ฆฌํ•œ๋‹ค๋ฉด, ๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝ์€ ์Šค์ฝ”ํ”„์™€ ์‹๋ณ„์ž๋ฅผ ๊ด€๋ฆฌํ•œ๋‹ค.

  • ์•„๋ž˜์˜ ๊ทธ๋ฆผ์„ ๋ณด๋ฉด ์Šค์ฝ”ํ”„๋ฅผ ๊ตฌ๋ถ„ํ•˜๋ ค ์‹๋ณ„์ž๋ฅผ ๋“ฑ๋กํ•˜๊ณ  ๊ด€๋ฆฌ๋ฅผ ํ•˜๋Š” ์ €์žฅ์†Œ ์—ญํ• ์„ ํ•˜๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ๋ ‰์‹œ์ปฌํ™˜๊ฒฝ๊ณผ ์Šค์ฝ”ํ”„ ์ฒด์ธ

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

  • ๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝ์— ๋Œ€ํ•ด ์ดํ•ดํ–ˆ๋‹ค๋ฉด, ๋ ‰์‹œ์ปฌ ์Šค์ฝ”ํ”„๋ฅผ ์•Œ์•„๋ณด์ž.

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

    const x = 1;
    
    function foo() {
      const x = 10;
      bar();
    }
    
    function bar() {
      console.log(x);
    }
    
    foo();
    bar();
    • ์œ„ ์˜ˆ์ œ์—์„œ ๋งŒ์•ฝ ๊ฒฐ๊ณผ๊ฐ’์„ 10์ด๋ผ๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค๋ฉด, ๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝ๊ณผ ์Šค์ฝ”ํ”„์— ๋Œ€ํ•ด ๋‹ค์‹œ ๊ณต๋ถ€๋ฅผ ํ•ด๋ณด๋Š” ๊ฑธ ์ถ”์ฒœํ•œ๋‹ค...^^
    • foo์™€ bar๋Š” ๋ชจ๋‘ ์ „์—ญ ํ•จ์ˆ˜์ด๋‹ค. ํ•จ์ˆ˜๋ฅผ ์–ด๋””์„œ ํ˜ธ์ถœํ•˜๋Š” ์ง€๋Š” ํ•จ์ˆ˜์˜ ์ƒ์œ„ ์Šค์ฝ”ํ”„ ๊ฒฐ์ •์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ๋ชปํ•œ๋‹ค.
    • ์ฆ‰, ํ•จ์ˆ˜์˜ ์ƒ์œ„ ์Šค์ฝ”ํ”„๋Š” ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•œ ์œ„์น˜์— ์˜ํ•ด ์ •์ ์œผ๋กœ ๊ฒฐ์ •๋˜๊ณ  ๋ณ€ํ•˜์ง€ ์•Š๋Š”๋‹ค.
    • ๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝ์˜ "์™ธ๋ถ€ ๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝ์— ๋Œ€ํ•œ ์ฐธ์กฐ"์— ์ €์žฅํ•  ์ฐธ์กฐ๊ฐ’, ์ฆ‰ ์ƒ์œ„ ์Šค์ฝ”ํ”„์— ๋Œ€ํ•œ ์ฐธ์กฐ๋Š” ํ•จ์ˆ˜ ์ •์˜๊ฐ€ ํ‰๊ฐ€๋˜๋Š” ์‹œ์ ์— ํ•จ์ˆ˜๊ฐ€ ์ •์˜๋œ ํ™˜๊ฒฝ(์œ„์น˜)์— ์˜ํ•ด ๊ฒฐ์ •๋œ๋‹ค.
    • ์ด๊ฒƒ์ด ๋ฐ”๋กœ "๋ ‰์‹œ์ปฌ ์Šค์ฝ”ํ”„"์ด๋‹ค.

2. ํด๋กœ์ €๋ž€?

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

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

  • ๊ธ€์ž๋กœ ๋ณด๋ฉด ์ดํ•ดํ•˜๊ธฐ ํž˜๋“œ๋‹ˆ, ์˜ˆ์ œ๋ฅผ ๋ณด๊ณ  ์•Œ์•„๋ณด์ž.

    const name = "์ฝ”๋‚œ";
    
    //1
    function outer() {
      const name = "๋ชจ์นด";
      const inner = function () {
        console.log(name);
      }; //2
      return inner;
    }
    
    const innerFunc = outer(); //3
    innerFunc(); //4 ๋ชจ์นด
    • ์˜ˆ์ œ๋ฅผ ๋ณด๋ฉด ์•Œ ์ˆ˜ ์žˆ๋“ฏ, outer ํ•จ์ˆ˜๋Š” ์ค‘์ฒฉ ํ•จ์ˆ˜ inner๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ  ์ƒ๋ช…์ฃผ๊ธฐ๋ฅผ ๋งˆ๊ฐํ•œ๋‹ค. outer ํ•จ์ˆ˜์˜ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๋Š” ์‹คํ–‰ ์ปจํ…์ŠคํŠธ ์Šคํƒ์—์„œ ์ œ๊ฑฐ๋œ๋‹ค.

      ์‹คํ–‰ ์ปจํ…์ŠคํŠธ : ์‹คํ–‰ํ•  ์ฝ”๋“œ์— ์ œ๊ณตํ•  ํ™˜๊ฒฝ ์ •๋ณด๋“ค์„ ๋ชจ์•„๋†“์€ ๊ฐ์ฒด๋กœ์„œ, ๋™์ผํ•œ ์Šค์ฝ”ํ”„์— ์žˆ๋Š” ์ฝ”๋“œ๋“ค์„ ์‹คํ–‰ํ•  ๋•Œ ํ•„์š”ํ•œ ํ™˜๊ฒฝ ์ •๋ณด๋ฅผ ๋ชจ์•„ ์ปจํ…์ŠคํŠธ๋ฅผ ๊ตฌ์„ฑํ•˜๊ณ , ์ด๋ฅผ ํ˜ธ์ถœ ์Šคํƒ(์ฝœ ์Šคํƒ)์— ์Œ“์•„์„œ ์‹คํ–‰ ์ˆœ์„œ๋ฅผ ๋ณด์žฅํ•œ๋‹ค. ๊ตฌ์„ฑ๋˜๋Š” ์š”์†Œ๋กœ๋Š” ๋ณ€์ˆ˜๊ฐ์ฒด, ์Šค์ฝ”ํ”„ ์ฒด์ธ, this๊ฐ€ ์žˆ๋‹ค.

    • ์ด๋•Œ, outer ํ•จ์ˆ˜์˜ ์ง€์—ญ ๋ณ€์ˆ˜ name๊ณผ ๋ณ€์ˆ˜ ๊ฐ’ '๋ชจ์นด'๋ฅผ ์ €์žฅํ•˜๊ณ  ์žˆ๋˜ outerํ•จ์ˆ˜์˜ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๊ฐ€ ์ œ๊ฑฐ๋˜์—ˆ์œผ๋ฏ€๋กœ outerํ•จ์ˆ˜์˜ ์ง€์—ญ ๋ณ€์ˆ˜ name ๋˜ํ•œ ์ƒ๋ช…์ฃผ๊ธฐ๋ฅผ ๋งˆ๊ฐํ•œ๋‹ค.
    • ๋”ฐ๋ผ์„œ outer ํ•จ์ˆ˜์˜ ์ง€์—ญ๋ณ€์ˆ˜ name์€ ๋”๋Š” ์œ ํšจํ•˜์ง€ ์•Š๊ฒŒ ๋˜์–ด name๊ฐ’์— ์ ‘๊ทผํ•˜๋Š” ๋ฒ•์€ ์—†์–ด ๋ณด์ธ๋‹ค.
    • ํ•˜์ง€๋งŒ, ์‹คํ–‰๊ฒฐ๊ณผ 4๋ฒˆ์˜ ๊ฒฐ๊ณผ๋Š” '๋ชจ์นด'์ด๋‹ค. ์ด๊ฒƒ์ด ๋ฐ”๋กœ ํด๋กœ์ €๋‹ค.
  • ๋˜ํ•œ, ์œ ๋…ํ•ด์•ผ ํ•˜๋Š” ๋ถ€๋ถ„์€ outer ํ•จ์ˆ˜์˜ ์‹คํ–‰์ปจํ…์ŠคํŠธ๊ฐ€ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ ์Šคํƒ์—์„œ ์ œ๊ฑฐ๋˜๋”๋ผ๋„, outerํ•จ์ˆ˜์˜ ๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝ๊นŒ์ง€ ์‚ญ์ œ๋˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค. outer ํ•จ์ˆ˜์˜ ๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝ์€ inner ํ•จ์ˆ˜์˜ [environment]์˜ ๋‚ด๋ถ€ ์Šฌ๋ก์— ์˜ํ•ด ์ฐธ์กฐ๋˜๊ณ  ์žˆ๊ณ , inner ํ•จ์ˆ˜๋Š” ์ „์—ญ ๋ณ€์ˆ˜ innerFunc์— ์˜ํ•ด ์ฐธ์กฐ๋˜๊ณ  ์žˆ์œผ๋ฏ€๋กœ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์˜ ๋Œ€์ƒ์ด ๋˜์ง€ ์•Š๋Š”๋‹ค.

    ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜: ์“ฐ๋ ˆ๊ธฐ ์ˆ˜์ง‘. ๋™์ ์œผ๋กœ ํ• ๋‹นํ•œ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ ์ค‘ ๋” ์ด์ƒ ์“ฐ์ด์ง€ ์•Š๋Š” ์˜์—ญ์„ ์ž๋™์œผ๋กœ ์ฐพ์•„๋‚ด์–ด ํ•ด์ œํ•˜๋Š” ๊ธฐ๋Šฅ

์ค‘์ฒฉ ํ•จ์ˆ˜์˜ ์™ธ๋ถ€ ํ•จ์ˆ˜ ๋ณ€์ˆ˜ ์ฐธ์กฐ


1.2. ์ผ๋ฐ˜์ ์ธ ํด๋กœ์ €

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

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

    function home() {
      const conan = "์ฒซ์งธ";
      const mocha = "๋‘˜์งธ";
    
      //ํด๋กœ์ €
      //์ค‘์ฒฉ ํ•จ์ˆ˜ son์€ ์™ธ๋ถ€ ํ•จ์ˆ˜๋ณด๋‹ค ๋” ์˜ค๋ž˜ ์œ ์ง€๋˜๋ฉฐ
      //์ƒ์œ„ ์Šค์ฝ”ํ”„์˜ ์‹๋ณ„์ž๋ฅผ ์ฐธ์กฐํ•œ๋‹ค.
      function son() {
        debugger;
        console.log(conan, mocha);
      }
      return son;
    }
    
    const son = home();
    son();

    ๋””๋ฒ„๊ทธ3

  • ํด๋กœ์ €๋ผ๊ณ  ํ• ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ

    1. ์–ด๋– ํ•œ ํ•จ์ˆ˜๋„ ์ฐธ์กฐํ•˜์ง€ ์•Š๋Š” ํ•จ์ˆ˜๋Š” ํด๋กœ์ €๊ฐ€ ์•„๋‹ˆ๋‹ค.

      function stuckyi() {
        const teamOne = "ํฌ์žฌ";
        const teamTwo = "๋ณ‘๋ฏผ";
      
        function cheerUp() {
          const teamThree = "์šฐ์˜";
      
          debugger;
      
          //์ƒ์œ„์Šค์ฝ”ํ”„์˜ ์‹๋ณ„์ž๋ฅผ ์ฐธ์กฐํ•˜์ง€ ์•Š๋Š”๋‹ค.
          console.log(teamThree);
        }
      
        return cheerUp;
      }
      
      const cheerUp = stuckyi();
      cheerUP();

      ๋””๋ฒ„๊ทธ1

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

    1. ์™ธ๋ถ€ํ•จ์ˆ˜๋ณด๋‹ค ์ƒ๋ช…์ฃผ๊ธฐ๊ฐ€ ์งง์€ ์ค‘์ฒฉํ•จ์ˆ˜๋Š” ์ผ๋ฐ˜์ ์ธ ํด๋กœ์ €๊ฐ€ ์•„๋‹ˆ๋‹ค.

      function team() {
        const teamOne = "์ฐฌ๋ฏผ";
      
        //cheerUp ํ•จ์ˆ˜๋Š” ํด๋กœ์ €์˜€์ง€๋งŒ ๊ณง๋ฐ”๋กœ ์†Œ๋ฉธํ•œ๋‹ค.
        function stuckyi() {
          debugger;
          //์ƒ์œ„ ์Šค์ฝ”ํ”„์˜ ์‹๋ณ„์ž๋ฅผ ์ฐธ์กฐํ•œ๋‹ค.
          console.log(teamOne);
        }
        stuckyi();
      }
      
      team();

      ๋””๋ฒ„๊ทธ2

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

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

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

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

  • ์•„๋ž˜ ์˜ˆ์‹œ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด, ๋™์ž‘์€ ํ•˜์ง€๋งŒ ์•„๋ž˜์˜ ์กฐ๊ฑด์„ ์ถฉ์กฑํ•˜์ง€ ๋ชปํ•  ๊ฒฝ์šฐ ์˜ค๋ฅ˜๋ฅผ ๋ฐœ์ƒ์‹œํ‚ฌ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋‹ค.

    • num ๋ณ€์ˆ˜ ๊ฐ’์ด increase ํ•จ์ˆ˜์˜ ํ˜ธ์ถœ ์ „๊นŒ์ง€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๊ณ  ์œ ์ง€๋˜์–ด์•ผ ํ•œ๋‹ค.

    • num ๋ณ€์ˆ˜์˜ ๊ฐ’์€ increase ํ•จ์ˆ˜๋งŒ์ด ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค.

    • ์นด์šดํŠธ ์ƒํƒœ๊ฐ€ ์ „์—ญ ๋ณ€์ˆ˜๋ฅผ ํ†ตํ•ด ๊ด€๋ฆฌ๋˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์–ธ์ œ๋“ ์ง€ ๋ˆ„๊ตฌ๋‚˜ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๊ณ  ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

      let num = 0;
      
      const increase = function () {
        return ++num;
      };
      
      console.log(increase()); //1
      console.log(increase()); //2
      console.log(increase()); //3
  • ํด๋กœ์ €์˜ ์‚ฌ์šฉ ์ด์œ ๋ฅผ ์•Œ๊ฒŒ ๋˜์—ˆ๋‹ค๋ฉด, ํด๋กœ์ €๋ฅผ ํ™œ์šฉํ•œ ์ฝ”๋“œ๋ฅผ ํ™•์ธํ•ด๋ณด์ž.

    const increase = (function () {
      let num = 0;
    
      //ํด๋กœ์ €
      return function () {
        //์นด์šดํŠธ ์ƒํƒœ๋ฅผ 1๋งŒํผ ์ฆ๊ฐ€์‹œํ‚จ๋‹ค.
        return ++num;
      };
    })();
    
    console.log(increase()); //1
    console.log(increase()); //2
    console.log(increase()); //3
    • ์นด์šดํŠธ ์ƒํƒœ๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ๋ณ€๊ฒฝํ•˜๊ณ  ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด num์„ ์ง€์—ญ๋ณ€์ˆ˜๋กœ ๋ณ€๊ฒฝํ–ˆ๋‹ค.
    • ์ด์ œ num ๋ณ€์ˆ˜๋Š” increase ํ•จ์ˆ˜๋งŒ์ด ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค.

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

  • ์บก์Šํ™”๋ž€ ๊ฐ์ฒด์˜ ์ƒํƒœ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ํ”„๋กœํผํ‹ฐ์™€ ํ”„๋กœํผํ‹ฐ๋ฅผ ์ฐธ์กฐํ•˜๊ณ  ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ๋Š” ๋™์ž‘์ธ ๋ฉ”์„œ๋“œ๋ฅผ ํ•˜๋‚˜๋กœ ๋ฌถ๋Š” ๊ฒƒ์ด๋‹ค.

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

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

    ๊ฒฐํ•ฉ๋„ : ๋ชจ๋“ˆ๊ณผ ๋ชจ๋“ˆ๊ฐ„์˜ ์ƒํ˜ธ ์˜์กด ์ •๋„. ์—ฌ๊ธฐ์„œ๋Š” ๊ณตํ†ต ๊ฒฐํ•ฉ๋„ (ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ์•„๋‹Œ ๋ชจ๋“ˆ ๋ฐ–์— ์„ ์–ธ๋˜์–ด ์žˆ๋Š” ์ „์—ญ ๋ณ€์ˆ˜๋ฅผ ์ฐธ์กฐํ•˜๊ณ  ์ „์—ญ๋ณ€์ˆ˜๋ฅผ ๊ฐฑ์‹ ํ•˜๋Š” ์‹์œผ๋กœ ์ƒํ˜ธ์ž‘์šฉํ•˜๋Š” ๊ฒฝ์šฐ)๋ฅผ ๋œปํ•œ๋‹ค. ๋‚ฎ์„์ˆ˜๋ก ์ด์ƒ์ ์ด๋‹ค.

  • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ๊ฐ์ฒด์˜ ๋ชจ๋“  ํ”„๋กœํผํ‹ฐ์™€ ๋ฉ”์„œ๋“œ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์™ธ๋ถ€์— ๊ณต๊ฐœ๋˜์–ด ์žˆ๋‹ค.

  • ๊ทธ๋ ‡๋‹ค๋ฉด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ์ •๋ณด์€๋‹‰์„ ์™„๋ฒฝํžˆ ์ง€์›ํ•  ์ˆ˜ ์žˆ์„๊นŒ?

    const Stuckyi = (function () {
      let _age = 0; //private
    
      function Stuckyi(name, age) {
        this.name = name; //public
        _age = age;
      }
    
      //ํ”„๋กœํ† ํƒ€์ž… ๋ฉ”์„œ๋“œ
      Stuckyi.prototype.sayHi = function () {
        console.log(`์•ˆ๋…•, ${this.name}! ๋„Œ ์ด์ œ ${_age}์‚ด์ด์•ผ~^^`);
      };
    
      return Stuckyi;
    })();
    
    const byeongmin = new Stuckyi("๋ณ‘๋ฏผ", 30);
    byeongmin.sayHi(); //์•ˆ๋…•, ๋ณ‘๋ฏผ! ๋„Œ ์ด์ œ 30์‚ด์ด์•ผ~^^**
    console.log(byeongmin.name); //๋ณ‘๋ฏผ
    console.log(byeongmin.age); //undefined
    
    const heeejj = new Stuckyi("ํฌ์žฌ", 30);
    heeejj.sayHi(); //์•ˆ๋…•, ํฌ์žฌ! ๋„Œ ์ด์ œ 30์‚ด์ด์•ผ~^^
    console.log(heeejj.name); //ํฌ์žฌ
    console.log(heeejj.age); //30
    • ์œ„์˜ ์˜ˆ์ œ๋ฅผ ๋ณด๋ฉด, ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ๋„ ์ •๋ณด์€๋‹‰์ด ๊ฐ€๋Šฅํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ธ๋‹ค. ์ฆ‰์‹œ ์‹คํ–‰ ํ•จ์ˆ˜๊ฐ€ ๋ฐ˜ํ™˜ํ•˜๋Š” Stuckyi ์ƒ์„ฑ์ž ํ•จ์ˆ˜์™€ Stuckyi ์ƒ์„ฑ์ž ํ•จ์ˆ˜์˜ ์ธ์Šคํ„ด์Šค๊ฐ€ ์ƒ์†๋ฐ›์•„ ํ˜ธ์ถœํ•  Stuckyi.prototype.sayHi ๋ฉ”์„œ๋“œ๋Š” ์ฆ‰์‹œ ์‹คํ–‰ ํ•จ์ˆ˜๊ฐ€ ์ข…๋ฃŒ๋œ ํ›„ ์‹คํ–‰๋œ๋‹ค. ํ•˜์ง€๋งŒ Stuckyi ์ƒ์„ฑ์ž ํ•จ์ˆ˜์™€ sayHi ๋ฉ”์„œ๋“œ๋Š” ์ด๋ฏธ ์ข…๋ฃŒ๋˜์–ด ์†Œ๋ฉธํ•œ ์ฆ‰์‹œ ์‹คํ–‰ ํ•จ์ˆ˜์˜ ์ง€์—ญ๋ณ€์ˆ˜ _age๋ฅผ ์ฐธ์กฐ ํ•  ์ˆ˜ ์žˆ๋Š” ํด๋กœ์ €์ด๋‹ค. ํ•˜์ง€๋งŒ ...

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

      const heeejj = new Stuckyi("ํฌ์žฌ", 30);
      heeejj.sayHi(); //์•ˆ๋…•, ํฌ์žฌ! ๋„Œ ์ด์ œ 30์‚ด์ด์•ผ~^^
      
      const byeongmin = new Stuckyi("๋ณ‘๋ฏผ", 40);
      byeongmin.sayHi(); //์•ˆ๋…•, ๋ณ‘๋ฏผ! ๋„Œ ์ด์ œ 40์‚ด์ด์•ผ~^^
      
      heeejj.sayHi(); //์•ˆ๋…•, ํฌ์žฌ! ๋„Œ ์ด์ œ 40์‚ด์ด์•ผ~^^
      • ์ด๊ฒƒ์€ Stuckyi.prototype.sayHi๊ฐ€ ๋‹จ ํ•œ ๋ฒˆ ์ƒ์„ฑ๋˜๋Š” ํด๋กœ์ €์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
      • Stuckyi.prototype.sayHi๊ฐ€ ์–ด๋–ค ์ธ์Šคํ„ด์Šค๋กœ ํ˜ธ์ถœ๋˜๋”๋ผ๋„ ํ•˜๋‚˜์˜ ๋™์ผํ•œ ์Šค์ฝ”ํ”„๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
      • ๊ทธ๋Ÿฌ๋ฏ€๋กœ, Stuckyi ์ƒ์„ฑ์ž ํ•จ์ˆ˜๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•  ๊ฒฝ์šฐ _age์˜ ๋ณ€์ˆ˜ ์ƒํƒœ๊ฐ€ ์œ ์ง€๋˜์ง€ ์•Š๋Š”๋‹ค.
      • ์ด์ฒ˜๋Ÿผ, ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ์ •๋ณด ์€๋‹‰์„ ์™„์ „ํžˆ ์ง€์›ํ•˜์ง€ ๋ชปํ•˜์˜€๋Š”๋ฐ .....

1.5 private ํ•„๋“œ ์ •์˜

  • ๋‹คํ–‰ํžˆ private ํ•„๋“œ๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋Š” ์ƒˆ๋กœ์šด ํ‘œ์ค€ ์‚ฌ์–‘์ด ์ œ์•ˆ๋˜์—ˆ๋‹ค.

  • ํ•ด๋‹น ๋ฌธ๋ฒ•์˜ ๋ธŒ๋ผ์šฐ์ € ์ง€์› ๋ฒ”์œ„๋Š” Private class features ์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

  • private ํ•„๋“œ์˜ ์„ ๋‘์— #์„ ๋ถ™์—ฌ ์‚ฌ์šฉํ•œ๋‹ค. private ํ•„๋“œ๋ฅผ ์ฐธ์กฐํ•  ๋•Œ์—๋„ #์„ ๋ถ™์—ฌ์•ผ ํ•œ๋‹ค.

    class Stuckyi {
      //private ํ•„๋“œ ์ •์˜
      #name = "์Šฌ๊ธฐ";
    
      constructor(name) {
        //private ํ•„๋“œ ์ฐธ์กฐ
        this.#name = name;
      }
    }
    
    const me = new Stuckyi("์šฐ์˜");
    
    //private ํ•„๋“œ #name์€ ํด๋ž˜์Šค ์™ธ๋ถ€์—์„œ ์ฐธ์กฐํ•  ์ˆ˜ ์—†๋‹ค.
    console.log(me.#name); //SyntaxError: Private field '#name' must be declared in an enclosing class
  • ๋‹ค๋งŒ ์ ‘๊ทผ์ž ํ”„๋กœํผํ‹ฐ๋ฅผ ํ†ตํ•ด ๊ฐ„์ ‘์ ์œผ๋กœ ์ ‘๊ทผํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์œ ํšจํ•˜๋‹ค.

    class Stuckyi {
      //private ํ•„๋“œ ์ •์˜
      #name = "";
    
      constructor(name) {
        //private ํ•„๋“œ ์ฐธ์กฐ
        this.#name = name;
      }
    
      //name์€ ์ ‘๊ทผ์ž ํ”„๋กœํผํ‹ฐ๋‹ค.
      get name() {
        //private ํ•„๋“œ๋ฅผ ์ฐธ์กฐํ•˜์—ฌ trimํ•œ ๋‹ค์Œ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
        return this.#name.trim();
      }
    }
    const me = new Stuckyi("   ํฌ์žฌ");
    
    console.log(me.name); //ํฌ์žฌ
  • ๋งˆ์ง€๋ง‰์œผ๋กœ private ํ•„๋“œ๋Š” ๋ฐ˜๋“œ์‹œ ํด๋ž˜์Šค ๋ชธ์ฒด์— ์ •์˜ํ•ด์•ผ ํ•œ๋‹ค. private ํ•„๋“œ๋ฅผ ์ง์ ‘ constructor์— ์ •์˜ํ•˜๋ฉด ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

    class Stuckyi {
      constructor(name) {
        //private ํ•„๋“œ๋Š” ํด๋ž˜์Šค ๋ชธ์ฒด์—์„œ ์ •์˜ํ•ด์•ผ ํ•œ๋‹ค.
        this.#name = name; //Private field '#name' must be declared in an enclosing class
      }
    }

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