Functional Programming
한번에 모든 것을 해결하지 않고 나눠서 생각하면 답이 더 분명하게 보인다.
프로그래밍 패러디임: 프로그래머에게 프로그래밍의 관점을 갖게하고 결정하는 역할을 한다.
- 명령형 프로그래밍: 프로그래밍의 상태와 상태를 변경시키는 구문의 관점에서 연산을 설명하는 방식. 알고리즘을 명시하고 목표는 명시 안함.
- 절차지향 프로그래밍: 수행되어야 할 연속적인 계산 과정을 포함하는 방식(C, C++)
- 객체지향 프로그래밍: 객체들의 집합으로 프로그램의 상호작용을 표현(C++, Java, C#)
- 선언형 프로그래밍: 어떤 방법으로 해야하는지(How)를 나타내기보다 무엇(What)과 같은지를 설명하는 방식.알고리즘 명시하지 않고 목표만 명시.
- 함수형 프로그래밍: 순수 함수를 조합하고 스포트웨어를 만드는 방식(클로저, 하스켈, 리스프)
함수형 프로그래밍이란?
함수형 프로그래밍은 계산결과를 표현의 평가로서 모델링하는 프로그래밍 스타일이다. 따라서 실행될 때 전역 상태를 변경하는 명령문으로 구성된 명령형 프로그래밍과 대조를 이룬다. 함수형 프로그래밍은 일반적으로 변경가능한 상태를 사용하지 않고 사이드 이펙트 없는 함수와 불변 데이터를 대신 사용한다.
중요한 점은 반드시 사이드 이펙트가 없어야 한다는 것이다. 사이드 이펙트가 없을 경우 테스트, 유지보수, 그리고 대부분 예측가능한 것들이 쉬워진다.
함수형 프로그래밍은 프로그래밍 언어나 방식을 배우는 것이 아니라 함수로 프로그래밍하는 사고를 배우는 것이라고 할 수 있다. 새로운 계산방법을 배우는 것처럼 사고의 전환을 필요로 한다. 다양한 사고방식으로 프로그래밍을 바라보면 더욱 유연한 문제해결이 가능해진다.
함수형 프로그래밍은은 계산을 수학적 함수의 조합으로 생각하는 방식을 말한다. 이것은 일반적인 프로그래밍 언어에서 함수가 특정 동작을 수행하는 역할을 담당하는 것과는 반대되는 개념으로 함수를 수행해도 함수 외부의 값이 변경 될 수 없다.
필요개념
- 1급 객체(First Object or 1급 시민)
- 1급 객체란 다음과 같은 조건을 만족하는 객체이다
- 변수나 데이터 구조안에 담을 수 있다.
- 파라미터로 전달 할 수 있다.
- 반환값으로 사용할 수 있다.
- 할당에 사용된 이름과 관계없이 고유한 구별이 가능하다.
- 동적으로 프로퍼티 할당이 가능하다.
- 자바스크립트에서 함수(Function)은 객체(Object)이므로 1급 함수로 불린다.
- 고차함수(High-Order Function)
- 람다 계산법에서 만들어진 용어로 아래 조건을 만족하는 함수
- 함수에 함수를 파라미터로 전달할 수 있다.
- 함수의 반환값으로 함수를 사용할 수 있다.
- 고차함수는 1급 함수의 부분집합이다. 추후에 배울 리액트의 고차 컴포넌트(HOC)는 컴포넌트를 사용하여 위의 조건을 만족하는 컴포넌트를 말한다.
- 불변성(Immutalbility)
- 함수형 프로그래밍에서는 데이터가 변할 수 없는데, 이를 불변성 데이터라고 한다.
- 데이터 변경이 필요한 경우, 원본 데이터 구조를 변경하지 않고 그 데이터의 복사본을 만들어 그 일부를 변경하고, 변경한 복사본을 사용해 작업을 진행하한다.
- 순수함수
- 순수함수한 함수형 프로그레밍에 필요한 개념으로 아래 조건을 만족하는 함수를 뜻한다.
- 동일한 입력에는 항상 같은 값을 반환해야 한다.
- 함수의 실행은 프로그램의 실행에 영향을 미치지 않아야 한다.( No side effect)
- 함수 내부에서 인자의 값을 변경하거나 프로그램 상태를 변경해서는 안된다는 것.
- 순수 함수를 호출하면 프로그램의 어떠한 변화도 없고, 입력 값에 대한 결과를 예상할 수 있어서 테스트하기에 쉽다.
- 데이터 변환방법
- 함수형 프로그래밍은 데이터 변경이 불가능하기 때문에 기존 데이터의 복사본을 만들어 주는 도구가 필요하다.
- 자바스크립트에는 이미 Array.map, Array.reduce등 데이터 복사본을 만들기 위한 함수 들을 제공하고 있다.
- 합성함수
- 합성함수란 새로운 함수를 만들거나 계싼하기 위해 둘 이상의 함수를 조합하는 과정을 말한다.
- 함수형 프고르맹은 여러 작은 순수 함수들로 이루어져있기에 이 함수들을 연쇄적으로 또는 병렬로 호출해서 더 큰 함수를 만드는 과정으로 전체 프로그램을 구축해야 한다.
const sum = (a, b) => a + b
const square = x => x * x
const addTen = x => x + 10
const computeNumbers = addTen(square(sum(3, 5))) // 74
함수형 프로그래밍을 구현하는 방법
함수형 프로그래밍은 순수 함수(Pure function)를 조합하고 공유 상태(shared state), 병경 가능한 데이터(mutable data) 및 부작용(side-effect)을 피하여 소프트웨어를 만드는 프로세스이다. 함수형 프로그래밍은 명령형(imperative)이 아닌 선언형(declarative)이며 애플르케이션의 상태는 순수 함수를 통해 전달된다.
출처 & 참고자료
함수형 프로그래밍 요약
Lodash의 대체재로서의 순수 자바스크립트 함수
생활코딩-불변성(immutable)