이 글은 유인동님의 "함수형 프로그래밍과 JavaScript ES6+" 강의를 수강하면서 작성한 포스팅입니다.
이번 포스팅에서 다룰 주제들입니다.
- 평가와 일급
- 일급 함수
- 고차 함수
프로그래밍을 시작하면서 개발쪽에서 평가와 일급이라는 단어는 아예 처음들어봤던 것 같다.
평가란 코드가 계산되어 값을 만드는 것
을 말한다. 정말 간단한 개념이다.
[1, 2+3]
=== [1, 5]
[1, 2, ...[3, 4]]
=== [1, 2, 3, 4]
그리고 일급은 여러가지 의미로 사용이 될 수 있다.
const a = 10; // 값으로 다룰 수 있고 변수에 담을 수 있다.
const add10 = a => a + 10; // 함수의 인자로 사용될 수 있다.
const r = add10(a); // 함수의 결과로 사용될 수 있다.
자바스크립트에서 함수가 일급이다.
함수가 일급이라는 것은 함수를 값으로써 다룰 수 있다는 의미이다.
그렇다면 함수를 값으로 다룰 수 있다는 의미는 무슨 뜻일까?
const add5 = a => a + 5;
log(add5); // a => a + 5
log(add5(5)); // 10
이런 식으로 add5라는 변수에 함수를 값으로 다뤄 담을 수 있다는 의미이다.
추가로 함수가 일급이라는 것은 함수의 결과값으로 함수가 사용될 수 있다는 것이다.
const f1 = () => () => 1;
log(f1()); // () => 1
const f2 = f1();
log(f2); // () => 1
log(f2()); // 1
자바스크립트에서 함수가 일급이라는 것은 조합성과 추상화의 도구로 함수를 잘 사용할 수 있다는 의미이다.
함수형 프로그래밍에서는 함수가 일급이라는 성질을 이용해서 많은 조합성을 만들어내고 추상화의 좋은 도구로 사용하고 있다.
일급함수는 함수가 값으로 다뤄질 수 있다는 의미였다.
고차함수는 일급함수의 개념을 이용해서 함수를 값으로 다루는 함수를 의미한다.
크게 2가지 케이스가 있다.
const apply1 = f => f(1);
const add2 = a => a + 2;
log(apply1(add2)); // 3
log(apply1(a => a - 1)); // 0 (이런식으로도 가능하다)
apply1이라는 함수는 f라는 함수를 인자로 받고 f라는 함수에 인자로 1을 넣어 실행시킨 결과값을 리턴해주는 함수이다.
apply1(add2)
이 부분을 보면 add2라는 함수를 apply1의 인자로 넣어줬다. 여기서 add2가 f인 것이다.
apply1은 f에 1을 넣어 실행시킨 값을 리턴해주기 때문에 add2 함수에 1을 인자로 넣어서 나온 결과값 3을 출력할 것이다.
// n만큼 f를 실행할 함수를 작성해보자.
const times = (f, n) => {
let i = -1;
while (++i < n) f(i);
}
// 여기서 log는 console.log 함수입니다
times(log, 3); // 0 1 2
times(a => log(a + 10), 3);
times라는 함수는 n만큼 f를 실행할 함수이다.
times(log, 3)
은 console.log(i)라는 함수를 ++i가 3(n)보다 작을 동안 실행시키라는 의미이다. 그래서 0 1 2가 출력되는 것이다.
이런식으로 함수를 인자로 받고 해당 함수 스코프내에서 인자로 받은 함수를 실행시켜 결과값을 리턴하는 것이다.
const addMaker = a => b => a + b; // 함수를 리턴하는 함수
const add10 = addMaker(10);
log(add10); // b => a + b
log(add10(10)); // 20
addMaker는 함수를 리턴하는 함수 (클로저를 만들어 리턴하는 함수)이다.
여기서 클로저가 무엇인지 간단하게 말하자면 addMaker라는 함수에서 a를 인자로 받고 있는데 b => a + b
에서 a를 기억하고 있는데 이런 개념을 클로저라고 한다.
클로저에 대한 자세한 개념은 클로저란 무엇일까? 링크를 확인해주길 바란다!