Back

Currying

커링(currying)은 기법이다.
여러 개의 매개변수를 받아 단일로 처리되는 함수를 각각의 매개변수를 호출하는 것이 가능하게 바꾼 것이다.

글만 봐서는 잘 이해가 되지 않는다. JavaScript에서 구현한 예시를 보자.

const multiply = (a, b) => a * b;
multiply(3, 4);
// => 12

multiply(3, 4); 를 실행하면 12가 나온다. 그냥 한 번에 두 개의 매개변수를 받아 곱한 것을 반환하는 함수다.

여기서 한 번에 하나의 매개변수만 받는 함수로 변경하고 싶다.

const multiply = (a, b) => a * b;
//multiply(3, 4);

const curriedMultiply = (a) => (b) => a * b;
curriedMultiply(3)(4);
// => 12

아래 새롭게 작성한 curriedMultiply 함수는 커링을 통해 변환한 함수다. 이 curriedMultiply 함수는 a 매개변수 하나를 받고 b 매개변수 하나를 받는 함수를 반환한다. 그리고 그 b 매개변수 하나를 받는 함수는 a * b를 반환한다.

결론적으로 한 번에 하나의 매개변수를 받는 함수가 되었다. 이것이 왜 유용할까? 이것을 통해서 여러 가지 유용한 함수를 만드는 것이 가능하다.

const multiply = (a, b) => a * b;
//multiply(3, 4);

const curriedMultiply = (a) => (b) => a * b;
//curriedMultiply(3)(4);

const curriedMultiplyBy3 = curriedMultiply(3);
curriedMultiplyBy3(4);
// => 12

이제는 이렇게 이미 선언된 curriedMultiplyBy3(4);를 통해 curriedMultiply(3)(4);를 호출한 것과 같은 결괏값을 얻을 수 있다.

아직은 와닿지 않지만, javascript.info 여기서 알려주는 예시를 보면 이것이 유용한 이유를 바로 알 수 있다.

function log(date, importance, message) {
    alert(
        `[${date.getHours()}:${date.getMinutes()}] [${importance}] ${message}`
    );
}

log(new Date(), "DEBUG", "some debug"); // log(a, b, c)

로그를 출력하는 함수를 위처럼 선언하면, 매번 log(new Date(), “DEBUG”, “some debug”); 이런 형식으로 사용을 해야 한다.

function log(date, importance, message) {
    alert(
        `[${date.getHours()}:${date.getMinutes()}] [${importance}] ${message}`
    );
}

log = _.curry(log);

let logNow = log(new Date());

let debugNow = logNow("DEBUG");

debugNow("message"); // [HH:mm] DEBUG 메세지

위의 예제는 lodash를 사용하여 커링으로 변환한 것이 다르긴 하지만, 아무튼 이렇게 커링을 적용한다면, debugNow(“message”); 사용을 통해 하나의 매개변수만 받아 사용하는 것이 가능하다.

이렇게 커링을 적용하여도 기존의 함수를 호출하는 것도 가능하며, 함수의 재사용을 쉽게 만들어주고, 가독성도 높여준다.