JavaScript/JS 활용 & etc..

커링 함수 (Curring function)

jaiyah 2016. 10. 14. 07:00

커링(Curring)

커링은 수학자 하스켈 커리로 부터 유래된 이름이고 함수를 변형하는 과정을 말한다.

함수의 전달인자 몇 개를 미리 채움으로써 더 간단한 함수를 만드는 방법입니다.


커링은 인도 음식인 커리와 아무런 관계가 없습니다.

커링은 수학자 하스켈 커리(Haskell Curry)로 부터 유래되었습니다.(하스켈 프로그래밍 언어가 그의 이름에서 따온 것이다.)

커링은 이 변형 방법의 원래의 발명가인 모세 쉔핀켈 이름을 따서 쉔필켄이라고도 부릅니다.


커링을 사용하는 경우

어떤 함수를 호출할 때 대부분의 매개 변수가 항상 비슷하다면 커링을 사용할 만한 후보라고 할 수 있다.

매개변수 일부를 적용하여 새로운 함수를 동적으로 생성하면 이 동적 생성된 함수는 반복적으로 사용되는 매개변수를 내부적으로 저장하여, 매번 인자를 전달하지 않아도 원본함수가 기대하는 기능을 채워 놓게 될 것이다.



간단한 커링함수 소스코드의 예제

javascript
// curring function
function curring(num) {
    // 클로저로 생성된 공간
    return function(add) {
        return num + add;
    };
}

var add = curring(5);
var result = add(5);

console.log(result);



다른 함수형 언어에세는 커링 기능이 언어 자체에 내장되어 있어 모든 함수가 기본적으로 커링됩니다.

자바스크립트에서는 아래의 add() 함수 수정하여 부분 적용을 처리하는 커링 함수로 만들 수 있습니다.

다음의 예제를 살펴봅니다.

javascript
// 커링된 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를 재사용합니다.

javascript
// 커링된 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));



Jaehee's WebClub