커링(Curring)
커링은 수학자 하스켈 커리로 부터 유래된 이름이고 함수를 변형하는 과정을 말한다.
함수의 전달인자 몇 개를 미리 채움으로써 더 간단한 함수를 만드는 방법입니다.
커링은 인도 음식인 커리와 아무런 관계가 없습니다.
커링은 수학자 하스켈 커리(Haskell Curry)로 부터 유래되었습니다.(하스켈 프로그래밍 언어가 그의 이름에서 따온 것이다.)
커링은 이 변형 방법의 원래의 발명가인 모세 쉔핀켈 이름을 따서 쉔필켄이라고도 부릅니다.
커링을 사용하는 경우
어떤 함수를 호출할 때 대부분의 매개 변수가 항상 비슷하다면 커링을 사용할 만한 후보라고 할 수 있다.
매개변수 일부를 적용하여 새로운 함수를 동적으로 생성하면 이 동적 생성된 함수는 반복적으로 사용되는 매개변수를 내부적으로 저장하여, 매번 인자를 전달하지 않아도 원본함수가 기대하는 기능을 채워 놓게 될 것이다.
간단한 커링함수 소스코드의 예제
// curring function
function curring(num) {
// 클로저로 생성된 공간
return function(add) {
return num + add;
};
}
var add = curring(5);
var result = add(5);
console.log(result);
다른 함수형 언어에세는 커링 기능이 언어 자체에 내장되어 있어 모든 함수가 기본적으로 커링됩니다.
자바스크립트에서는 아래의 add()
함수 수정하여 부분 적용을 처리하는 커링 함수로 만들 수 있습니다.
다음의 예제를 살펴봅니다.
// 커링된 add()
// 부분적인 인자의 목록을 받는다.
function add(x, y) {
var old_x = x, old_y = y;
if (typeof old_y === 'undefined') { // 부분적인 적용
return function (new_y) {
return old_x + new_y;
}
}
// 전체 인자를 적용
return x + y;
}
console.log(add(3, 5));
console.log(add(10)(10));
var add10 = add(10);
console.log(add10(20));
위 코드에서 처음 add()
를 호출할 때, add 가 반환하는 내부 함수에 클로저를 만듭니다.
클로저는 원래의 x, y 값을 비공개 변수인 old_x, old_y 에 저장하도록 합니다.
첫 번째 변수인 old_x 는 내부 함수가 실행될 때 사용됩니다.
부분적인 적용이 없고 x, y 둘다 전달되었다면, 이 함수는 단순히 이 둘을 더하게 됩니다.
add()는 설명을 위해 필요 이상으로 장황하게 구현되어 있습니다.
더 간단한 버전은 다음 예제에서 살펴볼 수 있습니다.
다음 예제는 old_x, old_y 가 없습니다.
원래의 x 는 암묵적으로 클로저에 저장되어 있고 이전 예제에서 new_y 라는 새로운 변수를 만들었던 것과는 달리 지역 변수 y를 재사용합니다.
// 커링된 add()
// 부분적인 인자의 목록을 받는다.
function add(x, y) {
if (typeof y === 'undefined') { // 부분적인 적용
return function (y) {
return x + y;
}
}
// 전체 인자를 적용
return x + y;
}
console.log(add(3, 5));
console.log(add(10)(10));
var add10 = add(10);
console.log(add10(20));
'JavaScript > JS 활용 & etc..' 카테고리의 다른 글
자바스크립트의 객체 상수 (0) | 2016.10.30 |
---|---|
Global NameSpace Function(범용 네임스페이스 함수) (0) | 2016.10.15 |
메모제이션(Memoization) 패턴 (0) | 2016.10.13 |
자기 자신을 정의하는 함수(lazy function) (0) | 2016.10.12 |
eval() 사용과 문제점 : #eval() is evil (5) | 2016.10.10 |