λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
🌌 | WEB DEV/Vanilla JS

JS_기술 (1)_ 컀링(currying)

by KASSID 2023. 3. 11.

λͺ©μ°¨

    728x90

    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

    λͺ¨λ‘ 같은 값을 λ°˜ν™˜ν•˜λ„λ‘ 값을 μ „λ‹¬ν•œ μ˜ˆμ‹œμ΄λ‹€.

     

    이처럼 ν•¨μˆ˜ 싀행에 ν•„μš”ν•œ λͺ¨λ“  인자λ₯Ό ν•œ λ²ˆμ— 받을 수 μ—†λŠ” 경우

    컀링을 톡해 μž‘μ„±ν•œ ν•¨μˆ˜λ₯Ό ν™œμš©ν•  수 μžˆλ‹€.

    λŒ“κΈ€