수복의 프로그래밍 여행기

순수함수가 아닌 일급함수는 함수를 값으로 다룰 수 있는 것이라고 생각하면 됩니다. 어떻게 하면 함수를 값으로 다루는 것일까요?? 아래와 같이 자바스크립트는 변수에 함수를 담아 둘 수 있습니다.

 

var func1 = function (a,b) {
  return a+b;
};

console.log(func1);

//결과값
ƒ (a,b) {
  return a+b;
}

사실 프로그래밍을 하면 실제로 함수를 변수에 담아 위와 같은 결과값을 보여주는 것은 거의 없을 겁니다. 하지만 함수가 실행되어 return되 결과값을 가지고 조합을 할 것입니다. 

 

function f1(f) {
    return f();
}
console.log(f1(function () {
    return 10;
}));

 사실 이 부분은 정말 위의 코드로도 이해가 어려울 것이라고 생각합니다. (함수 안에 들어간 함수에 인자를 넣고 return 값을 받아 보려고 했는데 실패를 너무 많이 하였습니다.)

 

그렇기 때문에, 아래와 같은 다른 예제 코드로 이해를 돕고자 합니다.

function add_maker(a) {
    return function (b) {
        return a+b;
    }
}
var add5 = add_maker(5);
console.log(add5(10)); // 15

함수에 return 값으로 다른 함수를 넣어 마지막 return 값으로 각 함수에서 받은 인자 값을 반환 하는 것입니다. 이 부분에서 클로저라는 부분이 들어가는데 이 부분은 여기서 제외하고 설명하겠습니다.

 

add_maker(5)의 값은 변수 add5 로 들어갑니다. 이 부분을 console 에 찍어보면 아래와 같이 나옵니다.

ƒ (b) {
        return a+b;
    }

 변수 add5는 위와 같은 함수를 가지고 b라는 인자를 받아 a+b를 리턴할 준비를 하고 있습니다.

 

그래서 add5라는 변수는 함수이고 인자 (10)을 넣어 5+10을 완성하여 값을 return 하고 있는 것입니다.

 

이 로직을 정말 잘 이해하셔야 프로그래밍할 때, 도움이 많이 됩니다. 왜냐하면, 내가 만든 것을 다른 곳에서 재사용할 일이 많기 때문입니다.

 

저의 글 중에 순수함수 마지막 절에 예제로 만든 코드가 있습니다. 함수에 인자를 함수로 받아 return 받은 값을 가지고 결과값을 만들어 냅니다. 수학식으로 본다면, 곱셈, 나눗셈, 덧셈, 뺄샘을 다 사용할 수 있습니다.

 

  • (((4+5) -2) X2) / 2

 

function calculation(f1,f2,f3,f4,f5) {
   return ((((f1()+f2())-f3())*f4())/f5());
}

console.log(calculation(
    function () {
        return 2;
    },
    function () {
        return 3;
    },
    function () {
        return 1;
    },
    function () {
        return 5;
    },
    function () {
        return 2;
    },
));

 사실 좋은 예제는 아니지만, 함수를 차례로 리턴한 값들을 위와 같이 만들 수 있긴 합니다. 차라리 앞에서 만든 예제가 더 좋은 거 같네요.

 

일급함수는 함수에 인자를 함수로 받는 경우가 많고 리턴된 값이 함수가 될 수도 있고, 변수가 될 수 있거나 값이 될 수 있습니다. 이 부분을 잘 이해한다면, 프로그래밍에 정말 도움이 될 것입니다.

 

출처: 자바스크립트로 알아보는 함수형 프로그래밍

profile

수복의 프로그래밍 여행기

@컴수복

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!