함수형 프로그래밍의 기원은 1930년대다. 당시 발견한 람다 계산법
이 함수형 프로그래밍의 시초라 할 수 있다. 함수를 함수로 넘기거나 함수가 함수를 결과로 내놓는 것도 가능하다. 다른 함수를 조작하고, 함수를 인자로 받거나 반환하는 것이 가능한 복잡한 함수를 고차 함수라고 한다.
1950년대 존 맥카시는 람다 계산법에 비롯한 개념을 프로그래밍 언어로 만들었는데, 바로 리스프
다. 리스프는 고차 함수라는 개념과 함수가 "1급 시민" 혹은 "1급 멤버"라는 개념을 구현했다.
함수가 1급 시민이 되려면 변수에 함수를 대입할 수 있고, 함수를 다른 함수에 인자로 넘길 수 있으며, 함수에서 함수를 만들어서 반환할 수 있어야 한다.
자바스크립트에서는 함수가 1급 시민이기 때문에 함수형 프로그래밍을 지원한다고 할 수 있다. 함수가 애플리케이션의 데이터를 표현할 수 있다. 문자열이나 수 또는 다른 모든 값과 마찬가지로 var
키워드를 사용해 함수를 정의할 수 있다.
var log = function(message) {
console.log(message);
}
log("메시지"); // 메시지
ES6에서는 화살표 함수를 사용해 다음과 같이 정의할 수 있습니다.
const log = message => console.log(message)
log("메시지"); // 메시지
함수를 변수에 넣을 수 있는 것과 마찬가지로 객체에 넣을 수도 있다.
const obj = {
message: "메시지",
log(message) {
console.log(message)
}
}
obj.log(obj.message); // 메시지
함수를 배열에 넣을 수도 있다.
const messages = [
"값 1",
message => console.log(message),
"값 2",
message => console.log(message)
]
messages[1](messages[0]) // 값 1
messages[3](messages[2]) // 값 2
함수를 다른 함수 인자로 넘길 수도 있다.
const inside = logger => logger("인자 넘기기");
inside(message => console.log(message)) // 인자 넘기기
var createScream = function(logger) {
return function(message) {
logger(message.toUpperCase() + "!!")
}
}
const scream = createScream(message => console.log(message))
scream("HAHAHA") // HAHAHA!!
// ES6
const createScream = logger => message => logger(message.toUpperCase() + "!!")
함수를 인자로 받거나 함수를 반환하는 함수를 고차 함수라 부른다.
선언적 프로그래밍
필요한 것을 달성하는 과정을 하나하나 기술하는 것보다 필요한 것이 어떤 것인지 기술하는 데 방점을 두고 애플리케이션의 구조를 세워나가는 프로그래밍 스타일
명령형 프로그래밍
코드로 원하는 결과를 달성해 나가는 과정에만 관심을 두는 프로그래밍 스타일
선언적 프로그래밍의 코드 구문은 어떤 일이 발생하는지 기술하고, 실제로 그 작업을 처리하는 방법은 추상화로 아랫단에 감춰진다. 코드 자체가 어떤 일이 벌어질 지 설명하기 때문에 추론하기 쉽다.
참조