-
[TIL] 함수형 프로그래밍Develope/Javascript 2020. 8. 8. 18:30
◎ 지금까지는 객체지향 프로그래밍이었다면 이제 함수를 기반하는 함수형 프로그래밍으로 많이 작성한다.
함수형 프로그래밍에 대해서 간략하게 알아보자!
1. 함수형 프로그래밍이란?
◎ 함수형 프로그래밍은 순수한 함수를 작성하고, 공유된 상태와 변경 가능한 데이터 및 부작용을 피하여 소프트웨어를 작성하는 프로세스이다.
함수형 프로그래밍은 선언형이며, 애플리케이션의 상태는 순수한 함수를 통해 전달된다.
애플리케이션의 상태가 공유되고, 객체의 메서드와 사용되는 객체 지향 프로그래밍과는 대조된다.
2. 순수 함수 (pure function)
◎ 순수 함수란 하나 이상의 인자를 받고, 받은 인자를 처리하여 반드시 결과물을 돌려주어야 한다는 것이다.
인자를 제외한 다른 변수는 사용하면 안 되고 받은 인자만으로 결과물을 내야 한다.
그리고 순수 함수는 부작용(Side Effect)이 없다. 이 말은 바꾸고자 하는 변수 외에는 바뀌어서는 안 된다는 뜻이다.
function notPure(array) { array.push("순수X"); } function notPure2(array) { return [ ...globalArray, "순수X"]; } function pureFunction(array) { return [ ...array, "순수"]; }
- notPure( )는 반환 값이 없기 때문에 순수하지 않다.
- notPure2( )는 인자 대신 공유 변수(globalArray)를 이용하고 있어 순수하지 않다.
- pureFunction( )은 인자를 받고, 받은 인자를 처리하기 때문에 순수 함수입니다.
순수 함수는 예측이 가능하고, 디버그가 쉬우며 테스트하는 것은 더욱 쉽다.
하지만 모든 함수가 순수할 수는 없다. I/O 작업, 난수 처리, 데이터베이스 등을 처리할 때는 본질적으로 순수할 수가 없다.
하지만, 함수가 다룰 수 있는 영역을 더 넓게 하고, 핵심을 간단하게 유지하기 위해 소프트웨어의 전반에 걸쳐 적용되어야 한다.
※ 무조건 순수 함수를 사용해야 하나?
◎ 순수 함수를 쓰지 않고 개발을 잘하면 상관이 없지만 어디서 어떻게 값이 변할지 모르는 코드에 대해서는 확실성을 갖기 힘들다.
순수 함수의 몇 가지 장점에 대해 알아보자
첫 번째, 테스트가 아주 쉽다. 이유는 같은 입력에 대해서 같은 출력을 내기 때문에 기대하는 값이 명확하기 때문이다.
두 번째, 병렬 처리에 유리하다. 순수 함수는 외부 함수에 대한 참조가 없고, 사이드 이펙트를 만들지 않기 때문에 병렬 처리가 가능하다.
2. 불변성 (immutability)
◎ Javascript에서 모든 원시 자료형은 불변하다.
불변한 객체나 배열은 만들어진 후에는 더 이상 수정할 수 없다.
수정하고 싶다면 복제해서 새로운 변수에 할당해야 한다.
// mutable const mutables = ["Hello" , "JinDevT"]; mutables.push("Mutable"); // immutable const immutables = ["Hello", "JinDevT"]; const newImmutables = [ ...immutables, "Immutable"]; // spread 연산자를 사용
이것은 오직 단 하나의 상태만을 가지고 있기 때문에, 불변한 객체나 배열은 그 내용을 변경해서 무효화시킬 수가 없고 이로 인해 부작용을 막을 수 있다.
※ Jasvascript에서는 Immutable.js 라이브러리를 사용할 수 있다.
3. 선언적 패턴 (declarative patterns)
◎ 선언적 프로그래밍은 우리가 이루고자 하는 것을 설명한다.
즉, 명령형 프로그래밍은 단계 별 할 일을 명시적으로 지시하는 반면, 선언적 프로그래밍은 일련의 선언들로 구성된다.
const language = ["Javascript", "Java", "Python"]; // 명령형 패턴 const shortNames = []; for (let i = 0; i < language.length; i ++) { if(language[i].length < 5) { shortNames.push(language[i]); } }; // 선언적 패턴 const shortNames = language.fillter(el => el.length < 5 );
선언적 패턴은 세부적인 구현 방법이 아니라 다루는 문제의 도메인에 초점을 맞춘다.
선언적 패턴은 더 간결하고, 더 에러가 적은 코드를 생성한다.
4. Higher Order Functions
◎ HOC(Higher Order Functions)는 다른 함수를 인자로 사용하거나 함수를 반환하는 함수, 또는 두 가지 특징을 모두 가진 함수이다.
고차 함수는 다음과 같은 경우 사용된다.
- 콜백 함수, 프로미스 등을 사용하여 동작과 효과 또는 비동기 흐름 제어를 추상화하거나 격리한다.
- 다양한 데이터 유형에 대해 작동할 수 있는 유틸리티를 생성한다.
- 함수를 부분적으로 인수에 적용하거나 재사용 또는 함수 조합을 위한 커리 함수를 작성한다.
- 함수 목록을 가져오고, 해당 입력 함수의 조합을 반환한다.
HOC를 사용한 코드를 봐보자.
const inEven = x => !(x % 2); const numbers = [1, 2, 3, 4, 5, 6, 7, 8]; const evenNumbers = numbers.filter(isEven); console.log(evenNumbers); // 2, 4, 6, 8
4. 느낀 점
◎ 함수형 프로그래밍에 대해 알아보려고 구글링은 했지만, 아직 내가 이해하기 힘든 설명들이 많았다.
그러던 중 두개의 블로그를 찾아서 글을 읽으면서 함수형 프로그래밍에 대해 간략히 이해를 하였다.
좀 더 깊게 배우기 위해 함수형 프로그래밍이란 무엇이고 , 내가 아는 기준에서 어떻게 작성하는지를 알고 난 뒤 배우면 좋을 거 같아서 블로깅 하였다.
※ 참조
https://blog.ull.im/engineering/2019/04/07/functional-programming-with-javascript-in-3-steps.html
'Develope > Javascript' 카테고리의 다른 글
[TIL] 이벤트 버블링, 이벤트 캡쳐 (0) 2020.08.24 [TIL] 브라우저의 동작 (0) 2020.07.30 [TIL] 반복문 종료방법(break, continue, return) (0) 2020.07.28 [TIL] SSR & CSR (서버 사이드 렌더링 & 클라이언트 사이드 렌더링) (0) 2020.07.27 [TIL] Javascript 비동기 처리 방식 (3) 2020.07.07