[JS] ES6+ 와 함수형 프로그래밍 (1)

아이엠강욱·2023년 2월 27일
0
post-thumbnail

이 글은 유인동님의 "함수형 프로그래밍과 JavaScript ES6+" 강의를 수강하면서 작성한 포스팅입니다.


이번 포스팅에서 다룰 주제들입니다.

  • 평가와 일급
  • 일급 함수
  • 고차 함수

평가와 일급

프로그래밍을 시작하면서 개발쪽에서 평가와 일급이라는 단어는 아예 처음들어봤던 것 같다.
평가란 코드가 계산되어 값을 만드는 것을 말한다. 정말 간단한 개념이다.

[1, 2+3]
=== [1, 5]

[1, 2, ...[3, 4]]
=== [1, 2, 3, 4]

그리고 일급은 여러가지 의미로 사용이 될 수 있다.

  • 값으로 다룰 수 있다.
  • 변수에 담을 수 있다. (함수를 변수에 담을 수 있다)
  • 함수의 인자로 사용될 수 있다.
  • 함수의 결과로 사용될 수 있다. (return 값으로 함수가 올 수 있다)
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가지 케이스가 있다.

  • 함수를 인자로 받아서 실행하는 함수
  • 함수를 만들어 리턴하는 함수 (클로저를 만들어 리턴하는 함수)

(1) 함수를 인자로 받아서 실행하는 함수

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가 출력되는 것이다.

이런식으로 함수를 인자로 받고 해당 함수 스코프내에서 인자로 받은 함수를 실행시켜 결과값을 리턴하는 것이다.

(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를 기억하고 있는데 이런 개념을 클로저라고 한다.

클로저에 대한 자세한 개념은 클로저란 무엇일까? 링크를 확인해주길 바란다!

profile
블로그 이전했습니다!! https://dev-iamkanguk.tistory.com/ <<- 여기로 오세용!!

0개의 댓글