커링 (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); // 10
                    
                
다른 함수형 언어에서는 커링 기능이 언어 자체에 내장되어 있어 모든 함수가 기본적으로 커링됩니다.
자바스크립트에서는 아래의 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)); // 8
                        console.log(add(10)(10)); // 20

                        var add10 = add(10);
                        console.log(add10(20)); // 30
                    
                
위 코드에서 처음 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)); // 8
                        console.log(add(10)(10)); // 20

                        var add10 = add(10);
                        console.log(add10(20)); // 30