함수형 프로그래밍과 JavaScript ES6+ 를 수강하며 기록한 내용입니다.
그동안 명령형으로만 프로그래밍을 해왔었다.
함수형 프로그래밍은 함수를 값으로 선언함으로서 사용하는 것으로 선언형 프로그래밍에 속한다.
일급 객체란 객체 자체가 값으로 사용되며, 변수와 인자로 사용할 수 있고, 결과로도 사용되는 객체이다.
즉, 함수형 프로그래밍은 함수를 일급 객체로 사용하는 것으로 일급함수를 만들어 사용하는 것부터 시작된다.
이렇게 만들어진 일급 함수를 조합하고 추상화하여 사용 할 수 있다.
add5 함수는 인자를 받아서 5를 더하는 역할을 하는 함수이다.
const add5 = (a) => a + 5;
add5는 (a) => a+5라는 값을 가진 함수이며, add(5)로 평가되어 10이라는 값으로도 사용할 수 있다.
다음은 함수의 결과가 함수가 될 수 있는 예시이다.
const f1 = () => () => 1;
f1함수는 함수를 리턴하고 리턴한 함수는 1을 반환한다.
즉 이렇게 f1()을 실행한다면 () => 1이라는 함수가 결과로 반환된다.
이렇게 함수가 값이 되는 함수를 고차함수라고 한다.
const f2 = f1();
() => 1이라는 함수를 f2로 선언하여 f2()로 평가하면 1이 출력된다.
고차함수는 두가지로 정의 내릴 수 있다.
하나는 위에서 말한 값으로 다룰 수 있는 함수이며, 하나는 함수를 인자로 받아서 실행하는 함수이다.
const apply1 = (f) => f(1);
위 함수는 함수를 인자로 받아서 받은 함수의 인자에 1을 넣어서 리턴하는 함수이다.
const add2 = (a) => a+2;
log(apply1(add2)) // 3 출력
apply1함수는 2를 더해주는 함수를 인자로 받는다.
혹은 아래와 같이 직접 함수를 작성할 수있다.
log(apply1((a)=>a-1)) // 0 출력
특정 숫자만큼 함수를 실행하는 함수를 만들어보자
다음은 함수를 값으로 만들어 리턴하는 함수이다.
const addMaker = (a) => (b) => a + b;
log(addMaker(3)) // (b) => a + b;
const add3 = addMaker(3);
log(add3(4)) // 7
log(addMaker(4)(3)) // 7
addMaker함수는 a를 인자로 받고 b를 인자로 받아 a와 b를 더하는 함수이다.
addMaker(3)의 값을 계속 기억하고 있다가 add3(4)를 실행했을 때 값이 계산되는 이유는 자바스크립트의 클로저 기능 때문이다.
클로저는 함수가 만들어진 시점을 기억하는 것으로 즉, 함수를 리턴하는 함수는 클로저를 리턴하는 것이라고도 표현 할 수 있다.