๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐ŸŒŒ | WEB DEV/Vanilla JS

JS_๊ธฐ์ˆ  (1)_ ์ปค๋ง(currying)

by KASSID 2023. 3. 11.

๋ชฉ์ฐจ

    JS์— ์กด์žฌํ•˜๋Š” ์ปค๋ง์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด์ž.

     

    1. ์ปค๋ง์ด๋ž€?

    ์ปค๋ง์€ ํ•จ์ˆ˜์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋Š” ๊ณ ๊ธ‰๊ธฐ์ˆ ๋กœ, JS ๋ฟ ์•„๋‹ˆ๋ผ ๋‹ค๋ฅธ ์–ธ์–ด์—์„œ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ์ˆ ์ด๋‹ค.

    ํ•„์š”ํ•œ ์ธ์ž๋ณด๋‹ค ์ ์€ ์ˆ˜์˜ ์ธ์ž๋ฅผ ๋ฐ›์œผ๋ฉด, ๋‚˜๋จธ์ง€ ์ธ์ž๋ฅผ ์ธ์ž๋กœ ๋ฐ›๋Š” ๋‹ค๋ฅธ ํ•จ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

     

    ์ฆ‰, ํ•œ ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ ์ธ์ž๊ฐ€ ์•„์ง ๋œ ์ค€๋น„ ๋˜์—ˆ์„ ๊ฒฝ์šฐ

    ํ˜„์žฌ ์กด์žฌํ•˜๋Š” ์ธ์ž๋ฅผ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด์„œ ์ปค๋ง์œผ๋กœ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

     

    ์˜ˆ์‹œ 1)

    ์•„๋ž˜๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•œ ๊ฒฝ์šฐ์ด๋‹ค.

    function mulTwoTerm (a, b, c, d) {
      return (a + b) * (c + d);
    }
    
    const mulTwoTerm2 = (a, b, c, d) => (a + b) * (c + d);
    
    console.log(
      mulTwoTerm(1, 2, 3, 4),
      mulTwoTerm2(1, 2, 3, 4),
    );
    
    >>> 21 21

    ์ด๋Ÿฌํ•œ ๊ฒฝ์šฐ ํ•จ์ˆ˜ ํ˜ธ์ถœ ์‹œ ํ•œ ๋ฒˆ์— 4๊ฐœ์˜ ์ธ์ž๋ฅผ ๋ชจ๋‘ ๋ฐ›์€ ํ›„ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

     

    ์˜ˆ์‹œ 2)

    ์•„๋ž˜๋Š” ์ปค๋ง์œผ๋กœ ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•œ ๊ฒฝ์šฐ์ด๋‹ค.

    function curryMulTwoTerm (a){
      return function (b) {
        return function (c) {
          return function (d) {
            return (a + b) * (c + d);
          }
        }
      }
    }
    
    const curryMulTwoTerm2 = a => b => c => d => (a + b) * (c + d);
    
    console.log(
      curryMulTwoTerm(1)(2)(3)(4),
      curryMulTwoTerm2(1)(2)(3)(4),
    );
    
    >>> 21 21

    ํ˜ธ์ถœ ์‹œ ์ผ๋ฐ˜์ ์ธ ํ•จ์ˆ˜์™€ ๋‹ค๋ฅธ ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

    ๋งค๊ฐœ๋ณ€์ˆ˜์— ๊ฐ’์„ ์ „๋‹ฌํ•  ๋•Œ ํ•œ ๋ฒˆ์— ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ ํ•˜๋‚˜์”ฉ ์ „๋‹ฌํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค.

     

     

    ์ด๋ฅผ ํ™œ์šฉํ•˜๋Š” ์˜ˆ์‹œ๋ฅผ ์ข€ ๋” ์‚ดํŽด๋ณด์ž.

    const curryMulTwoTermA = curryMulTwoTerm(1);
    const curryMulTwoTermB = curryMulTwoTerm(1)(2);
    const curryMulTwoTermC = curryMulTwoTerm(1)(2)(3);
    
    console.log(curryMulTwoTermA);
    console.log(curryMulTwoTermB);
    console.log(curryMulTwoTermC);
    
    >>>
    ƒ (b) {
        return function (c) {
          return function (d) {
            return (a + b) * (c + d);
          }
        }
      }
    
    >>>
    ƒ (c) {
          return function (d) {
            return (a + b) * (c + d);
          }
        }
        
    >>> 
    ƒ (d) {
            return (a + b) * (c + d);
        }

    ์œ„์˜ ๊ฒฐ๊ณผ๋ฅผ ๋ณด๋ฉด ์› ํ•จ์ˆ˜์˜ ์ธ์ž๋ณด๋‹ค ์ ๊ฒŒ ์ „๋‹ฌ์„ ํ•œ ๊ฒฝ์šฐ

    ๊ฐ๊ฐ์˜ ๋‹จ๊ณ„ ๋ณ„ ํ•จ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

     

    ์ด๋ฅผ ์ด์–ด์„œ ์ถ”๊ฐ€๋กœ ๊ฐ’์„ ์ „๋‹ฌํ•˜๋ฉด

    console.log(
    curryMulTwoTermA(2)(3)(4),
    curryMulTwoTermB(3)(4),
    curryMulTwoTermC(4)
    );
    
    >>> 21 21 21

    ๋ชจ๋‘ ๊ฐ™์€ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ๊ฐ’์„ ์ „๋‹ฌํ•œ ์˜ˆ์‹œ์ด๋‹ค.

     

    ์ด์ฒ˜๋Ÿผ ํ•จ์ˆ˜ ์‹คํ–‰์— ํ•„์š”ํ•œ ๋ชจ๋“  ์ธ์ž๋ฅผ ํ•œ ๋ฒˆ์— ๋ฐ›์„ ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ

    ์ปค๋ง์„ ํ†ตํ•ด ์ž‘์„ฑํ•œ ํ•จ์ˆ˜๋ฅผ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

    ๋Œ“๊ธ€