함수형 프로그래밍은 패러다임이자 코딩 스타일이다.
객체지향이 실제 세상의 모델을 객체형태로 변환한다면
함수형프로그래밍은 이름답게 함수가 메인이다.
즉, input을 받아 output을 반환하는 기능이 메인이다.
이때 주의해야할 점이 있다. 함수는 side effect를 발생해선 아니된다.
이를 지킨 함수를 순수함수라고 칭한다.
https://youtu.be/e-5obm1G_FY?si=AIxy4wQz0inMyLCA
순수함수는 부수적 효과(side effect)를 발생시켜선 안된다.
//외부상태를 참조하거나 바꿔선 안된다.
const a = 5;
function sum(b){
return a×b
}
//이 또한 순수하지 않다.
function write(text){
console.log(text)
}
두번째는 조금 의아할수도 있다.
그러나 순수함수는 항상 input을 받아 값을 return해야한다.
함수형 프로그래밍에서 중요한점 두번째는 데이터의 불변성이다.input으로 받아오는 값은 불변해야한다.
이는 js의 원시형타입의 불변성과 참조형(객체)의 가변성 개념과 똑같다.
즉, input으로 들어온 참조형 데이터가 변경되서는 안된다.
=> 이를 not in place 알고리즘이라고 한다. (전체를 복사한 뒤 in place 알고리즘을 사용해도 된다)
순수함수의 외부 값을 변경하면 안된다를 참조형 데이터로 확장한 것이다.
//참조형 데이터를 직접 조작해선 안된다.
function removeElement(array, index){
array[index] = null;
return array;
}
//복제하여 사용해야한다.
function removeElementFp(array, index){
const temp = [...array];
temp[index] = null;
return temp;
}
물론 중첩객체는 단순 spread시 얕은 복사로 인하여 문제가 발생하겠지만, 편의를 위하여 1차원배열로 가정했다.
Fp가 붙은 함수는 불변성을 잘 지켰다. 그러나 의문이 생긴다. 배열의 길이가 매우 크다면 시간+공간복잡도를 많이 잡아먹는다.
순수함수 하나 만들겠다고 말도 안되는 오버헤드가 발생한다.
다행히도 이를 해결하기 위한 자료구조가 존재한다.
불변성을 지키면서 시간 + 공간복잡도까지 최적화 할순 없을까?
우리는 언제나 문제에 직면한다. 개발자는 어떻게든 문제를 해결하는 사람이다. 이 문제 또한 해결해준 개발자분이 계시다!
이를 영속자료구조라 하며 요점은 다음과 같다.
공간복잡도는 당연히 in-place보다 살짝 효율이 떨어지겠지만, 시간복잡도가 n 미만으로 줄었다!