함수형 프로그래밍은 객체지향, 절차적 프로그래밍와 같은 프로그래밍 패러다임중 하나이다. 함수형 코드는 객체지향보다 간결하고, 테스트하기 쉬운 경향이 있지만 함수형 코드에 생소하다면 복잡해 보일 수 있다.
함수형 프로그래밍을 이해하기 위해선 몇가지 핵심 개념들을 이해하고 있어야 한다.
자바스크립트의 함수는 객체이므로 1급 함수라고도 표현될 수 있다.
const sum = (a, b) => a + b;
const resultSum = sum(1, 2);
const sumAgain = (a, b, sum) => sum(a, b);
순수 함수는 함수형 프로그래밍 패러다임에 제일 중요한 개념중 하나이다. 순수함수가 강력한 이유는 항상 같은 결과를 반환해주기 때문에 테스트나 디버깅하기 간편해진다.
const myName = (name) => `Hello ${name}`;
myName("Leonardo") // Should always return "Hello Leonardo"
순수 함수를 충족하기 위한 특징
순수 함수가 아닌 예제
let count = 0;
const increaseCount = (value) => count += value;
함수를 인수로 받거나 함수를 반환하는 함수를 고차 함수라고 한다. 함수를 다루는 함수라고도 볼 수 있다.
const names = ["Leonardo", "Lucas", "Bianca", "José", "Maria", "Joe"];
const sayHiToNames = names.map(name => `Hello ${name}`);
합성함수란 새로운 함수를 만들거나 계산하기 위해 둘 이상의 함수를 조합하는 과정을 말한다. 작은 순수함수들로 이루어져 있는 함수형 프로그래밍에선 이런 함수들을 잘 조합해서 더 큰 함수를 만드는게 함수형 프로그래밍의 핵심 개념이라고 할 수 있다.
const splitName = (name) => name.split('_').join(' ');
const returnNameCapitalized = (name) => name.toUpperCase();
console.log(returnNameCapitalized(splitName('leonardo_maldonado')));
함수형 프로그래밍은 선언적 패러다임이다.
const numbers = [1, 2, 3, 4, 5];
const sumNumbers = (n) => n.reduce((acc, current) => acc + current);
const numbers = [1, 2, 3, 4, 5];
const sumNumbers = (n) => {
let finalResult = 0;
for (let i = 0; i < n.length; i++) {
finalResult += n[i];
}
return finalResult;
}
불변성 객체는 생성된 순간 더 이상 수정 할 수 없는 객체이다.
// 불변이 아닌 변하는(Mutatable) 데이터
function rateColor(color, rating) {
color.rating = rating;
return color;
}
console.log(rateColor(color_lawn, 5), rating) // 5
console.log(color_lawn.rating) // 5
// 불변성 데이터
function rateColor(color, rating) {
return Object.assign({}, color, { rating:rating });
}
console.log(rateColor(color_lawn, 5), rating) // 5
console.log(color_lawn.rating) // 0 *변하지 않음*
❗❗❗ 중요: 자바스크립트 ES6의 fill, pop, sort, splice, unshift, reverse, push 등 의 메소드는 원본 객체를 수정하기에 함수형 프로그래밍에서는 쓰는 것을 금지해야한다.