Notice
Recent Posts
Recent Comments
관리 메뉴

즐겁게, 코드

커링은 어려워 본문

💬 언어/Javascript

커링은 어려워

Chamming2 2021. 2. 18. 02:37

커링은 sum(a, b) 처럼 단일 호출로 처리되는 함수를 sum(a)(b) 처럼 여러 번의 호출로 분리하는 기법입니다.

const sum = (a, b) => {
    return a + b;
}

console.log(sum(1,2)); // 3

두 수의 합을 구하는 평범한 함수인데요, 위의 sum 함수는 두 인자를 입력받아 계산한 값을 리턴합니다.

그러나 커링을 적용하면 아래처럼 두 인자를 입력받아 계산한 값을 리턴하는 함수를 리턴하게 됩니다.

const curriedSum = (f) => {
  return (a) => {
    return (b) => {
      return f(a, b);
    };
  };
};

const sum = (a, b) => {
  return a + b;
};

let res = curriedSum(sum);
console.log(res(1)(2)); // 3

커링을 이해하기 위해 반드시 기억해야 할 점은 함수에게 중요한 것은 연산에 필요한 인자를 모두 제공받는 것이지, 어떤 과정을 거치는지는 크게 중요하지 않다는 것입니다.

커링의 목적?

커링을 배우면서 든 생각은 '그래서 이게 왜 필요한데?' 였습니다.

 

커링은 하스켈 이라는 함수형 프로그래밍 언어에서 처음 등장한 기법인데요, 하스켈의 함수는 언제나 한 개의 인자만을 가질 수 있습니다.

따라서 두 개의 수를 더하는 함수를 짜려면 두 개의 함수가 필요한 것처럼 작은 함수의 합성으로 함수를 완성하기 위해 커링이 탄생하게 된 것입니다.

 

따지고 보면 하스켈의 구조상 f(x, y)를 계산할 수 없으니 이를 f(g(x))로 치환하도록 한 것이 커링의 기원같은데, 과연 이런 방식이 얼마나 효과적일지는 아직 잘 와닿지 않네요. 🤣

 

그래도 특정한 상황에서는 커링을 유용하게 사용할 수 있습니다.

함수의 재사용

const curriedSum = (a) => {
  return (b) => {
    return (c) => {
      return (d) => {
        return a + b + c + d;
      };
    };
  };
};

const result1 = curriedSum(1)(2)(3);
console.log(result1(4)); // 10

const result2 = curriedSum(1)(3);
console.log(result2(5)(7)); // 16

단순하면서도 커링을 사용하는 가장 멋진 이유입니다.

커링을 이용한 함수는 각 인자를 전달하는 과정마다 작은 함수로 분리할 수 있는데요, 마치 당구대 홈에 공들을 예쁘게 집어넣듯 원하는 위치에 원하는 인자를 대입할 수 있습니다.

 

당장은 어디에 써야 할지 막막하더라도(사실 저도 막막합니다) 알면 알수록 모호한 함수형 프로그래밍의 매력에 빠져들 수 있을 것입니다.

TL;DR

- 커링은 단일 호출 함수를 쪼개어 다중 호출 함수로 만드는 기법이다.

- 커링을 사용하면 함수의 직관성 & 재사용성을 확보할 수 있다.

반응형
Comments
소소한 팁 : 광고를 눌러주시면, 제가 뮤지컬을 마음껏 보러다닐 수 있어요!
와!! 바로 눌러야겠네요! 😆