이 블로그는 광고 클릭 수익으로 운영됩니다!
괜찮으시다면 광고 차단을 풀어주세요 ㅠㅠ

게시글

강좌34 - JavaScript - 2년 전 등록 / 일 년 전 수정

자바스크립트 커링(Currying)

조회수:
0
이 블로그는 광고 클릭 수익으로 운영됩니다!
괜찮으시다면 광고 차단을 풀어주세요 ㅠㅠ
이 블로그는 광고 클릭 수익으로 운영됩니다!
괜찮으시다면 광고 차단을 풀어주세요 ㅠㅠ

안녕하세요. 이번 시간에는 함수형 프로그래밍 기법 중 하나인 커링에 대해 알아보겠습니다.

커링

커링을 쉽게 설명하면, 여러 개의 인자를 받는 함수가 있을 때 일부의 인자만 받는 함수를 만드는 기법입니다. 코드로 보면 이해하기 쉽습니다.

var plus = function(a, b, c) {
  return a + b + c;
};

위와 같은 평범한 함수에서, currying을 위해 함수의 prototype에 특별한 메소드를 추가합니다. 그래야 모든 함수에서 curry를 사용할 수 있으니까요.

Function.prototype.curry = function() {
  var args = [].slice.apply(arguments);
  var self = this;
  return function() {
    return self.apply(null, args.concat([].slice.apply(arguments)));
  };
};

코드를 보죠. args는 arguments를 복사한 겁니다. 그리고 함수를 return 하는데 args는 클로저 형식으로 저장됩니다. 그리고 이제 새로운 함수에 인자가 들어왔을 때 기존에 있던 args와 concat하는거죠.

var plusa = plus.curry(1);
plusa(2, 3); // 6
var plusb = plusa.curry(2);
plusb(4); // 7
var plusab = plus.curry(1, 3);
plusab(5); // 9

이렇게 일부 인자만 받은 새로운 함수를 만들고, 나중에 새로운 함수에 인자를 넣어 완성합니다.

bind 함수를 쓰면 더 깔끔합니다. 위의 curry 메소드를 prototype에 추가할 필요 없이

var plusa = plus.bind(null, 1);
plusa(2, 3); // 6
var plusb = plusa.bind(null, 2);
plusb(4); // 7
var plusab = plus.bind(null, 1, 3);
plusab(5); // 9

하면 됩니다! 그냥 bind를 씁시다. 참고로 커링을 다음과 같이 알고 있는 사람도 있는데 이건 다른 게 아니라 틀린 겁니다. (얼마 전까지만 해도 저도 이게 맞는 줄 알았습니다)

function multiply(x) {
  return function(y) {
    return x * y;
  };
}
multiply(4)(8); // 32

커링은 여러개의 인자를 받는 함수를 일부만 받도록 바꾸는 거지, 처음부터 하나씩만 받도록 하는 게 아닙니다.

커링을 어디에 쓸까요? 사실 아직까지는 많은 곳에 쓰이지는 않습니다. 함수형 프로그래밍이 자바스크립트에서 자주 쓰이지 않거든요. 하지만 이전의 상태들이 저장된 새로운 함수를 만들 수 있다는 점에서, 함수형 프로그래밍으로 객체지향 프로그래밍의 IIFE를 흉내낼 수 있습니다.

다음 시간에는... 뭘할까요? 재귀메모이제이션을 하겠습니다.

투표로 게시글에 관해 피드백을 해주시면 많은 도움이 됩니다. 오류가 있다면 어떤 부분에 오류가 있는지도 알려주세요! 잘못된 정보가 퍼져나가지 않도록 도와주세요.
Copyright © 2016- 무단 전재 및 재배포 금지

댓글

아직 댓글이 없습니다.