함수형 프로그래밍은 이름 그대로 함수를 기반으로 동작하는 프로그래밍이다.
함수형 프로그래밍은 순수 함수
라는 개념에서부터 출발한다.
순수 함수
- 받은 인자만으로 결과물을 만들어야 하며,
- 선언 시점과 외부의 영향을 받지 않는 함수를 말한다.
이해가 잘 가지 않는다면 다음과 같은 코드로 이해해보자.
array=[1,2,3,4]
만들 함수는 기존 array라는 리스트에 입력한 num을 더한 값을 반환하는 함수이다.
const addNum=(array)=>{
array.push(6);
}
console.log(addNum(array)) // undefined
console.log(array) // [1,2,3,4,6]
어쩌면 자주 써왔을지도 모르는 push가 들어간 함수이다.
이 함수는 return(반환값)이 없으며, 그렇기에 array를 변경시키는 부과 효과를 통해 원하는 결론에 도출하였다.
하지만, 이런 방법은 array의 값이 변경된다는 단점이 있다.
const addNum=()=>{
return [...array,6]
}
console.log(hi()) // [1,2,3,4,6]
이번에는 case 1의 문제점을 고쳤다. return을 사용해 외부의 데이터를 바꾸지 않게 만들었다. 하지만, 아직도 순수 함수에 다가가기에는 약간 부족하다.
순수 함수는 받은 인자만으로 결과물을 만들어야 하기 때문이다.
case 2의 함수를 약간 수정해 보겠다.
const addNum=(array)=>{
return [...array,6]
}
console.log(hi()) // [1,2,3,4,6]
드디어 순수 함수가 만들어졌다.
- 하나 이상의 인자가 있으며,
- return(반환값)이 반드시 존재해야 하며,
- 선언 시점에 영향받지 않고,
- 외부의 영향을 받지 않는,
- 심지어 받은 인자만으로 결과물을 만들어야 하는
이것이 바로 순수하디 순수한 순수 함수
라고 할 수 있다.
이러한 까다로운 특징 덕분에 순수 함수를 사용하면
쉽게 에러를 추적할 수 있으며,
아무런 부작용(side effect)를 발생시키지 않게 된다.
일급 객체
- 변수나 데이터에 할당할 수 있어야 한다.
- 객체의 인자로 넘길 수 있어야 한다.
- 객체의 리턴값으로 리턴할 수 있어야 한다.
자바스크립트에서는 함수도 객체이다. 추가로 함수도 일반 객체와 같은 취급이 가능하다.
즉, 자바스크립트의 함수는 일급 객체로, 함수를 객체처럼 자유롭게 반환 값으로 사용하거나, 다른 함수들의 파라미터로써 사용될 수 있다.
함수형 프로그래밍은 앞선 순수 함수의 장점을 가지고 프로그래밍을 한다.
함수형 프로그래밍
side effect
가 발생하지 않으며,
함수의 외부에 있는 데이터를 변경 혹은 의존하지 않는다.
- 순수함수를 통해 부수효과를 미워하고 조합성을 강조해 모듈화 수준을 높혀 생산성을 높인다.
앞선 순수 함수와 비슷해보이는데 이러한 특징으로 인해 다음과 같은 장점을 가진다.
쉽게 에러 추적이 가능하며,
코드의 재사용성이 높아진다.
아래는 글을 작성하면서 참고한 문서들이다.