먼저 함수형 프로그래밍의 특징을 알아보자.
let num = 1;
function add(x){
return a + num;
}
위와 같은 예제에서는 add라는 함수 안에서 전역으로 선언된 변수인 num을 참조하기 때문에 순수함수라고 볼 수 없다.
function add(a,b){
return a + b;
}
const result = add(2,3);
위와 같이 add의 함수가 프로그램 실행에 영향을 미치지 않고 입력 값에 대해서만 값의 변환이 있으므로 순수함수이다.
순수 함수는 프로그램의 변화 없이 입력 값에 대한 결과를 예상 할 수 있어 테스트가 용이하다.
let person = {name: 'sarah', age:'40'};
function increaseAge(person){
person.age = person.age + 1;
return person;
}
위 예제에서는 increaseAge함수에서 전역으로 선언된 person의 age속성을 변경하므로 불변성 유지를 만족하지 못한다.
const person = {name: 'sarah', age:'40'};
function increaseAge(person){
return {...person, age: person.age + 1};
}
위처럼 객체의 값을 바꾸기 위해서는 데이터의 복사본을 만들어, 그 복사본을 사용해 작업을 진행하고 반환한다.
명령형 프로그래밍은 무엇을 어떻게 할 것인가에 주목하고, 선언형 프로그래밍을 무엇을 할 것인가에 주목한다.
let numbers = [1,2,3];
function multiply(numbers,multiplier){
for(let i = 0; i < numbers.length; i++){
numbers[i] = numbers[i] * multiplier;
}
}
위 예시는 for문을 사용해서 배열의 각 요소에 multiplier를 곱해주는 명령형 프로그래밍이다.
함수형 프로그래밍에서는 마찬가지로 if, switch, for 등 명령문을 사용하지 않고 함수형 코드로 사용해야 한다.
function multiply(number,multiplier){
return number.map((num) => num * multiplier);
}
위 예시는 for문을 map으로 대치했고, javascript에서는 filter, map, take, reduce들의 함수형 코드를 사용한다.
함수형 프로그래밍에서는 함수가 1급객체가 된다.
아래 예시는 함수를 변수에 할당하거나 반환하는 1급 객체로서의 특징을 보여준다.
const add = (num) => num + 2;
const multiply = (num) => num * 2;
const transform = (num) => num.map(add).map(multiply);
console.log(trasform([1,2,3,4])); //[6,8,10,12]
고차함수의 특징은 아래와 같다.
const addString = (name) => (age) => age + name;
const name = addString('sarah');
console.log(name('40'))//40sarah