커링이란???
여러개의 인자를 받는 함수를 하나의 인자만 받는 연속된 함수들로 바꾸는 테크닉을 의미한다.
코드를 보면서 확실히 개념에 대해 알아보자.
아래 curry 함수는 여러개의 인자를 받는 함수를 대상으로 커링을 해주는 함수이다.
a,b 두개의 인자를 받는 sum이라는 함수를 curry 함수에 넣게 되면,
sum(a, b) 라는 기존의 방식에서 curriedSum(a)(b) 와 같은 방식으로 바뀌게 되는 것이다.
function curry(f) { // 커링 변환을 하는 curry(f) 함수
return function(a) {
return function(b) {
return f(a, b);
};
};
}
// usage
function sum(a, b) {
return a + b;
}
let curriedSum = curry(sum);
alert( curriedSum(1)(2) ); // 3
뭐, 대강의 개념은 알겠다.
근데 이걸 도대체 어디에 써먹는다고 함수형프로그래밍에서 자주 얘기하는 걸까?
개발을 하게 되면 거의 필수적으로 사용하게 되는 로그 함수에 커링을 적용하는 실제 사례를 보면서, Currying을 왜 쓰는지, 어떠한 이점이 있는지에 대해 알아보자.
자, 다음과 같은 log 함수가 있다.
function log(date, importance, message) {
alert(`[${date.getHours()}:${date.getMinutes()}] [${importance}] ${message}`);
}
이 함수에 커링을 적용해 보자. (참고로, 아래의 _.curry는 lodash 라이브러리에서 제공하는 currying 함수이다. 위에서 우리가 만들었던 curry(f)의 고급화버전이라고 생각하면 되겠다.)
log = _.curry(log);
이제, 커링이 적용된 log는 아래처럼 각각의 인자를 분리해서 호출해도 정상적으로 작동하게 된다.
log(new Date())("DEBUG")("some debug");
//그러면, 현재 로그를 남기는 함수를 이렇게 따로 변수에 저장 할 수 있다.
let logNow = log(new Date());
//그리고 이 logNow함수를 원하는 곳에서 호출 하면된다.
logNow("INFO", "message");
//하지만, 애초에 로그라는 것이 현재시간 기준으로 남기는게 일반적이기 때문에, 이걸 굳이 인자로 빼서
//커링 까지 해야 할까? 라는 의문이 들 수 있다.
//그럼 좀 더 효율적으로 만들어보자.
let debugLog = logNow("DEBUG");
let infoLog = logNow("INFO");
//이제 우리는 debug레벨의 로그를 남기는 함수와 info 레벨의 로그를 남기는 함수를 분리했고, 이제 실제로 로그를 남길 때에는
//아래의 방식으로 간단하게 로그를 남길 수 있게 됐다.
debugLog('message');
infoLog('message')
'JavaScript' 카테고리의 다른 글
[JS] 깊은 복사, 얕은 복사 (깊은 복사 하는 방법) (0) | 2022.08.26 |
---|---|
Cookie 옵션 설정하기 (feat. iframe cookie 문제 해결) (0) | 2022.07.12 |
마우스 휠 이벤트 등록(js) (0) | 2022.06.29 |
Mixed Content 문제 해결하기(https에서 http 사이트로 요청) (1) | 2022.06.15 |
Hoisting(var, let, const, function ) (0) | 2022.05.23 |