함수형 프로그래밍이란??
명령형 프로그래밍을 기반으로 개발했던 개발자들은 전역 데이터가 많이 있는 스파게티 코드를 유지 보수하는 일이 굉장히 힘들다는 것을 깨닫고,
선언형 프로그래밍
의 일종인 함수형 프로그래밍 패러다임을 적용했다. 함수형 프로그래밍은 거의 모든 것을순수함수
로 나누어 문제를 해결하는 기법으로, 작은 문제를 해결하기 위한 함수를 가독성을 높이고 유지보수를 용이하게 해준다.
선언형프로그래밍에 대해서 궁금하시다면 제가 작성한 프로그래밍 패러다임(선언형 vs 명령형) 글은 참고해주세요~~
부수효과
가 없는순수 함수
를1급 객체
로 간주하여 파라미터나 반환값으로 사용할 수 있으며,참조 투명성
을 지킬 수 있다.
지금부터 함수형 프로그래밍의 핵심 키워드인 부수효과
,순수 함수
, 1급 객체
, 참조 투명성
을 알아보면서 함수형 프로그래밍에 대해 제대로 파헤쳐보자
함수에서 참조하는 변수가 외부에 있어서 그것을 변화시킬 수 있을 때 생긴다. 즉, 부수효과는 외부의 State에 의존하게 될 때 생긴다.
부수효과가 있는 함수 예시
const arr = [1,2,3];
function change(arr){
arr[1] = 4;
}
change(arr);
console.log(arr); // [1,4,3]
부수효과가 없는 함수 예시
const arr = [1,2,3];
function change(v, i) {
return i === 1 ? (v = 4) : v;
}
const changedArr = arr.map(change);
console.log(arr); // [1,2,3]
console.log(changedArr); // [1,4,3]
- 동일한 입력에는 항상 같은 값을 반환해야한다.
- 함수의 출력(return)은 오로지 그 함수에 입력에(input)된 값에만 의존한다.
- 부수효과가 존재해서는 안된다.
함수형 프로그래밍에서는 순수함수의 조합으로 프로그래밍을 하는 것이 바로 핵심이다.
- 변수나 데이터 구조안에 담을 수 있다.
- 파라미터로 전달할 수 있다.
- 리턴 값으로 사용할 수 있다.
변수나 데이터 구조에 담을 수 있다.
const add = function(a,b) {
return a + b;
}
add(5, 3) // 8
파라미터로 전달할 수 있다.
function printA(){
console.log("A");
}
$target.addEventListener("click", printA);
함수 반환하기
function add(a) {
return function(b) {
return a + b;
}
}
- 동일한 인자에 대해 항상 동일한 결과를 반환해야 한다.
- 참조 투명성을 통해 기존의 값은 변경되지 않고 유지된다. =>
(Immutable Data)
즉, 함수형 프로그래밍은 참조 투명성을 통해 부수효과를 없애고 프로젝트 디버깅을 좀 더 용이하게 할 수 있다.
비동기 처리
비동기 같은 경우 스레드가 동시에 실행되기 때문에 명령형으로 코드를 작성할 경우 코드 디버깅 및 구현이 굉장히 힘들다. 특히 교착상태에 빠질 위험이 존재하고 명령형으로 구현 시 굉장히 복잡하고 고려해야할 요소들이 많다. 이러한 문제 역시 스레드 간 공유 데이터나 상태 값이 변경 가능(mutable)
하기 때문에 발생하는 문제이다.
하지만 함수형 프로그래밍 같은 경우 모든 데이터가 변경 불가능(immutable)
하고 함수는 부수효과를 가지고 있지 않다. 따라서 동시성과 관련된 문제를 원천적으로 봉쇄가 가능하다.
함수형 프로그래밍은 참조 투명성을 위해 기존의 값은 변경하지 않고 계속해서 필요한 새로운 데이터를 만들어 낸다. 앞서 예로 들었던 부수효과가 없는 함수의 예시를 다시 한 번 보자.
const arr = [1,2,3];
function change(v, i) {
return i === 1 ? (v = 4) : v;
}
const changedArr = arr.map(change);
console.log(arr); // [1,2,3]
console.log(changedArr); // [1,4,3]
우리는 arr에서 [1,4,3]이라는 결과를 만들기 위해 arr이라는 값은 변경하지 않았지만 changedArr라는 새로운 배열을 하나 더 만들어냈다.
만약 정말 복잡하고 데이터가 많은 상황이라면 공간복잡도 문제에 대해서도 심각하게 고려해봐야 할 것이다.
많은 프로그래머들 역시 이에 대한 고민을 많이 했으며 이를 해결하기 위해 immutable.js
나 immer
와 같은 라이브러리들이 존재한다.
참고자료
JSConf-Javascript로 함수형 배우기 영상
함수형프로그래밍에 대해
함수형프로그래밍을 배워야하는 이유
왜 함수형프로그래밍이 좋을까?
함수형 프로그래밍이란?
javascript에서 왜 함수가 1급객체일까요?
와우.. 함수형 프로그래밍에 대해 잘 이해할 수 있었습니다!! 감사합니다 👍👍