객체형 프로그래밍은 자바스크립트를 공부하면서 조금씩은 봤지만, 함수형 프로그래밍은 자세히 공부한적이 없었다. 비교 영상이나 글은 많이 보았지만, 함수형 프로그래밍의 특성만 조금 더 자세히 알고 싶어서 오늘은 함수형 프로그래밍으로 정했다.
프로그래밍 패러다임?
프로그래머에게 프로그래밍의 관점을 갖게하고 코드를 어떻게 작성할 지 결정하는 역할을 한다. 새로운 프로그래밍 패러다임을 통해서는 새로운 방식으로 생각하는 법을 배우고, 이를 바탕으로 코드를 작성한다.
크게 2가지로 구분한다.
1) 명령형 프로그래밍
- 무엇을 할것인지(What) 나타내기보다는 어떻게 할건지(How)를 설명하는 방식
- 절차지향 프로그래밍: 수행되어야 할 순차적인 처리 과정을 포함하는 방식(C, C++)
- 객체지향 프로그래밍: 객체들의 집합으로 프로그램의 상호작용을 표현(C++, Java, C#)
2) 선언형 프로그래밍
- 어떻게 할건지(How) 보다는 무엇(What)을 할건지 설명하는 방식
- 함수형 프로그래밍: 순수 함수를 조합하고 소프트웨어를 만드는 방식(클로저, 하스켈, 리스프)
함수형 프로그래밍
- 함수형 프로그래밍은 거의 모든것을 순수 함수로 나누어 문제를 해결하는 기법으로, 작은 문제를 해결하기 위한 함수를 작성하여 가독성을 높이고 유지보수를 용이하게 해준다.
함수형 프로그래밍 특징
부수효과가 없는 순수함수를 1급 객체로 간주하여 파라미터로 넘기거나 반환값으로 사용할 수 있으며, 참조 투명성을 지킬 수 있다.
✨ 부수효과(Side-Effect)란?
- 변수의 값이 변경된다
- 자료구조를 제자리에서 수정한다
- 객체의 필드값을 설정한다
- 예외나 오류가 발생하여 실행이 중단된다
- 콘솔 또는 파일 I/O가 발생한다
✨ 순수함수란?
이러한 부수효과(Side Effect)들을 제거한 함수들을 순수 함수(Pure Function)이라고 부르며, 함수형 프로그래밍에서 사용하는 함수는 이러한 순수 함수들이다!!
- 동일한 입력에는 항상 같은 값을 반환해야 한다.
- Memory or I/O의 관점에서 Side Effect가 없는 함수
- 함수의 실행이 외부에 영향을 끼치지 않는 함수
- 함수내에서 인자를 제외한 다른 변수는 사용하면 안된다.
순수함수의 예제를 보자! 인자로 받은 sum과 count만 활용했기 때문에 순수함수이다.
function add(sum, count) {
sum += count;
if (count > 0) {
return add(sum, count - 1);
} else {
return sum;
}
}
add(0, 10); // 55
✨1급객체란?
다음과 같은 조건을 만족하는 객체이다.
- 변수나 데이터 구조안에 담을 수 있다.
- 파라미터로 전달 할 수 있다.
- 반환값(return value)로 사용할 수 있다.
- 할당에 사용된 이름과 관계없이 고유한 구별이 가능하다
- 동적으로 프로퍼티 할당이 가능하다.
* 자바스크립트에서 함수는 객체(Object)이므로 1급 함수라고 불린다.
저번에 공부했던 고차 컴포넌트와 비슷한 고차함수(High-Order-Function)는 함수에 함수를 파라미터로 전달 할 수 있고, 함수의 반환값으로 함수를 사용할 수 있다. 즉 HOF는 1급 함수의 부분 집합인 셈
✨참조투명성(Referential Transparency)
- 동일한 인자에 대해 항상 동일한 결과를 반환해야 한다
- 참조 투명성을 통해 기존 값이 변경되지 않고 유지된다(Immutable Data)
✨ 불변성(Immutablility)
- 함수형 프로그래밍에서는 데이터가 변할 수 없는데, 이를 불변성 데이터라고 한다.
- 데이터 변경이 필요한 경우, 원본 데이터 구조를 변경하지 않고 그 데이터를 복사본으로 만들어 그 일부를 변경하고 변경한 복사본을 사용해 작업을 진행한다.
* JS에서 불변성을 지키기 위해 Object.assign() 함수를 이용할 수 있다.
Object.assign
그렇다면 데이터를 변경하기 위해서는,
기존 데이터의 복사본을 만들어줘야한다. (데이터 변경이 불가능해서)
자바스크립트에는 Array.map, Array.reduce, Array.filter 등 새로운 데이터를 만들기 위한 함수를 제공한다.
- filter을 사용한 예제
const arr = [4, 15, 377, 395, 400, 1024, 3000];
const arr2 = arr.filter((v) => (v % 5 === 0));
console.log(arr2) // [15, 395, 400, 3000]
🧡함수형 프로그래밍을 요약하자면,
1. 변경가능한 상태를 불변상태로 만들어 순수함수를 통한 side-effect를 없애자
2. 모든 것은 객체이다(함수는 1급 객체!)
3. 현실 세계에서는 부수 효과가 전혀 없는 프로그램을 만드는 것은 어렵다. 하지만 함수형 프로그래밍은 값처럼 쓰이고, 함수간의 결합이 쉽기 때문에 간결하고 가독성 좋은 코드를 만들 수 있는 장점이 있다.
참고 자료
https://mangkyu.tistory.com/111
https://velog.io/@goody/JS-%ED%95%A8%EC%88%98%ED%98%95-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D
'개발일지 > TIL' 카테고리의 다른 글
[TIL] 210726 오늘 공부는 클래스형 컴포넌트 특징 (0) | 2021.07.29 |
---|---|
[TIL] 210723 오늘 공부는 this와 화살표 함수 (0) | 2021.07.24 |
[TIL] 210721 오늘 공부는 실행 컨텍스트 + 호이스팅 + 콜스택 (0) | 2021.07.22 |
[TIL] 210720 오늘 공부는 ES6의 비구조화 할당(Destructuring Assignment) (0) | 2021.07.21 |
[TIL] 210719 오늘 공부는 box-model과 flex-model (0) | 2021.07.20 |