자바스크립트 프로젝트에서 함수형 기법의 사용이 점점 늘어나는 중이다. 배열에 대해 map이나 reduce를 적용해 봤다면 여러분은 이미 함수형 프로그래머가 되는 첫걸음을 뗀 것이다. 함수형 프로그래밍 기법은 리액트 뿐 아니라 리액트 생태계를 이루는 여러 라이브러리의 근간이기도 한다.

절차지향 프로그래밍의 단점을 극복하기 위해서 객체지향 프로그래밍이 등장했다면, 함수형 프로그래밍은 객체지향 프로그래밍의 단점을 극복하기 위해서 등장했다.

객체지향은 프로그램을 상호작용(interaction)하는 객체들의 집합으로 볼 수 있지만, 함수형은 상태 값을 지니지 않는 함수 값들의 연속으로 생각할 수 있게한다.

객체지향은 객체 안에 상태를 저장하고, 이 상태를 이용해서 메소드를 추가하고 상태변화를 설정하고 조정하기위해 다양한 기능을 사용합니다.

이에 반해 함수형은 상태를 제어하는 것보다 상태를 저장하지 않고 없애는게 포인트이다. 그래서 함수형은 간결한 프로그래밍에 적합하다.

함수형 프로그래밍의 역사

1930년

람다 계산법(lambda calculus)이 함수형 프로그래밍의 시작이라 할 수 있다. 17세기 함수가 등장한 이래 함수는 계속해서 계산법의 일부였다. 함수를 함수에 넘기거나 함수가 함수를 결과로 내놓는 것도 가능하다. 다른 함수를 조작하고, 함수를 인자로 받거나 반환하는 것이 가능한 복잡한 함수를 고차 함수(high order function)라고 부른다.

1950년

존 맥카시(John McCarthy)가 리스프라는 새로운 프로그래밍 언어를 만들었다. 리스프는 고차 함수라는 개념과 1급 시민(first class citizen), 1급 멤버(first class member)라는 개념을 구현했다.

함수형이란 무엇인가?

First Citizen

자바스크립트에서는 함수가 1급 시민이기 때문에, 자바스크립트는 함수형 프로그래밍을 지원한다고 말할 수 있다. 최신 자바스크립트에서는 함수형 프로그래밍 기법을 더 풍부하게 해주는 화살표 함수, promise, 스프레드 연산자 등의 개선이 추가됐다.

아래는 함수가 1급 시민이라 가능한 문법이다.

자바스크립트에서는 함수가 어플리케이션의 데이터를 표현할 수도 있다. 문자열이나 수, 또는 다른 모든 값과 마찬가지로 var 키워드를 사용해서 함수를 정의할 수 있다.

var log = function(message) {
  console.log(message)
}

log("In JavaScript functions are variables")

화살표 함수를 사용해 같은 함수를 정의할 수 있다.

const log = message => console.log(message)

log("ES6 arrow function")

함수를 객체나 배열에 넣을 수도 있다.

const obj = {
    message: "They can be added to objects like variables",
    log(message) {
        console.log(message)
    }
}

obj.log(obj.message)

const messages = [
  "They can be inserted into arrays",
  message => console.log(message),
  "like variables",
  message => console.log(message)
]

messages[1](messages[0])
messages[3](messages[2])