프로그래밍 패러다임마다 장단점이 존재하는데 각각의 특징과 장단점을 잘 알고 적절하게 사용할 줄 아는 것이 중요하기때문에 잘 몰랐던 함수형 프로그래밍에 대해 정리해보았다.
순수 함수와 보조 함수의 조합을 통해 외부 상태를 변경하는 부수 효과를 최소화해서 불변성(immutability)을 지향하는 프로그래밍 패러다임이다.
function add(a, b) {
return a + b;
}
console.log(add(1, 2)); // 3
console.log(add(1, 2)); // 3
순수 함수는 동일한 인수가 전달되면 언제나 동일한 값을 반환하기때문에 결과를 예측할 수 있고 테스트하기 편하다.
다음의 조건을 만족하는 객체를 일급 객체라고 한다.
자바스크립트는 함수를 값과 동일하게 사용할 수 있기때문에 함수형 프로그래밍이 가능하다.
// 외부에서 전달받은 f를 n만큼 반복 호출한다.
function repeat(n, f) {
for (let i = 0; i < n; i++) {
f(i); // i를 전달하면서 f를 호출
}
}
const logAll = function (i) {
console.log(i);
};
// 반복 호출할 함수를 인수로 전달한다.
repeat(5, logAll); // 0 1 2 3 4
const logOdds = function (i) {
if (i % 2) console.log(i);
};
// 반복 호출할 함수를 인수로 전달한다.
repeat(5, logOdds); // 1 3
함수를 매개변수로 전달할 수 있기때문에 유연한 구조를 갖게된다.
조건문과 반복문 대신 map
,reduce
등 고차함수를 사용해서 코드의 가독성을 향상시킨다.
함수형 프로그래밍은 거의 모든 것을 순수 함수로 나누어 문제를 해결하는 기법으로, 작은 문제를 해결하기 위한 함수를 작성하여 가독성을 높이고 유지보수를 용이하게 해준다.
또 변경 가능한 상태를 원천적으로 배제하기 때문에 프로그래머는 잠금(Lock)과 동기화(Synchronize)와 같은 골치 아픈 스레드 관련 문제에서 벗어나 핵심 로직 구현에 집중할 수 있다.
하지만 UI어플리케이션에서는 많은 상태 변화가 일어나기때문에 함수형 프로그래밍만 이용하기는 어려운 부분이 있다.
자바스크립트는 명령형, 함수형, 프로토타입 기반 객체지향 프로그래밍을 지원하는 멀티 패러다임 프로그래밍 언어이므로 필요할때 적절히 섞어서 사용하면 될 것 같다.
모던 자바스크립트 Deep Dive
https://mangkyu.tistory.com/111
https://engineering.linecorp.com/ko/blog/functional-programing-language-and-line-game-cloud/#lazy-eval
https://www.youtube.com/watch?v=4ezXhCuT2mw