순수함수를 조합하고, 데이터의 불변성을 최대한 보장함으로써 부수효과를 최소화하는 프로그래밍 패러다임이다.
함수형 프로그래밍(Functional Programming)은 객체지향 프로그래밍에 비해 신규 등장한 개념이다. 그래서인지, 객체지향형보다 개념정립이 명쾌하게 된 자료를 찾아보기 어려웠다. 객제지향 프로그래밍처럼 “N대 개념” 이런 식의 정형화된 설명이면 좋겠지만, 그렇게 정리하긴 어려워서 자주 등장하는 개념을 위주로 정리했다.
순수함수
- 동일한 입력에는 항상 같은 값을 반환해야 한다. 그러기 위해, 함수 외부의 변수를 사용하지 말고 오로지 파라미터만으로 로직을 꾸린다고 생각하면 편하다.
- 부수효과(Side Effect)가 없다.
- 순수함수의 경우, 입력값에 대한 결과를 예상할 수 있어서 테스트가 용이하다.
불변성
- 함수형 프로그래밍에서는 데이터가 변할 수 없다.
- 데이터 변경이 필요한 경우, immutable하게끔 그 데이터를 복제한 후 변경해서 쓴다.
선언형 프로그래밍
-
명령형 프로그래밍은 How를 작성하고, 선언형 프로그래밍은 What을 작성한다. 아래 예시에서 차이를 보자.
// 명령형 프로그래밍 function double (arr) { let newArr = []; for (let i = 0; i < arr.length; i++){ newArr.push(arr[i] * 2); } return newArr } // 선언형 프로그래밍 function double (arr) { return arr.map((item) => item * 2) }
고차함수(Higher-order Function)
- 리액트에서의 HOC와 비슷한 개념
- 함수에 함수를 파라미터로 전달할 수 있다.
- 함수의 반환값으로 함수를 사용할 수 있다.
합성함수(Function composition)
- 둘 이상의 함수를 조합하는 방법이다.
- 메서드 체이닝 방식으로 사용한다.
- 유명한 라이브러리인
lodash
가 대표적이다.
커링(Curring)
- 함수 하나가 n개의 인자를 받는 과정을 n개의 함수로 각각의 인자를 하나씩 받도록 하는 패턴이다.
- 커링의 장점은, 당장 n개의 파라미터를 모두 채울 수 없더라도, 있는 파라미터를 이용해 우선 부분 실행해둘 수 있다는 것이다.
-
Wrapper 구조라 가독성은 좀 떨어진다.
const callSomeone = greeting => { return name => { console.log(greeting + "! " + name); }; }; callSomeone("Hello")("Hyunsang"); // Hello! Hyunsang const sayHelloSomeone = callSomeone("Hello"); sayHelloSomeone("Hyunsang"); // Hello! Hyunsang
그밖에 1급 객체(1급 시민) 등의 개념도 나오지만, 이는 기회가 되면 따로 다루는 편이 좋겠다.
[참고자료]
https://velog.io/@kyusung/함수형-프로그래밍-요약
https://www.youtube.com/watch?v=jVG5jvOzu9Y