함수형 프로그래밍(Functional Programming)
함수 단위의 조합으로 프로그램을 구성하는 방법이다.
OOP의 한계점
- 함수의 비 일관성 : OOP에서 사용되는 함수는 동일한 입력에 대해서 다른 결과를 반환하는 경우가 있다.
- 자동차의 위치를 반환하는 메소드의 경우 현재 위치에 의존하여 동작한다.
- 객체 간 의존성 증가 : 객체 간 상호작용을 위해 함수가 다른 객체의 함수를 호출한다.
- 객체 내 상태 변화 제어의 어려움 객체 내의 변수는 객체에서 제공하는 함수에 의해 변경된다.다수의 외부 경로를 통해서 객체 내에 함수가 변경된 경우 추적하는 것이 쉽지 않다.
함수형 프로그래밍의 특징
- FP(Functional Programming)은 상태를 제어하기 보다는 상태를 없애고 목적에 집중하는 프로그래밍 패러다임이다.
- 객체 단위로 문제를 분해하지 않고 함수들의 세트로 문제를 분해한다
- 주어진 입력에 대하여 항상 같은 결과를 출력으로 내보낸다.
- 함수를 값으로 취급한다.
함수형 프로그래밍의 3가치 원칙
- 입출력이 순수해야한다. -
순수 함수(Pure Function)
- Side Effect가 없어야 한다.
- 함수와 데이터를 중점으로 생각한다.
함수형 프로그래밍의 장점
- 함수의 수행 결과를 입력 값에만 의존하도록 설계하기 때문에 시스템의 불규칙한 상태 변화에 의한 예기치 못한 영향을 최소화 할 수 있다.
- 버그, 외부 시스템 공격에도 쉽게 원인을 찾아 고칠수 있음을 의미
- 멀티스레드 환경에서의 객체 내 상태 변화 제어의 어려움이 발생하지 않는 구조이다. 따라서 유지보수가 뛰어나다.
함수형 프로그래밍의 단점
- 입출력 일관성을 위해 상태를 허용하지 않으므로 같은 기능의 구현을 위해 다양한 함수의 조합을 고안해야 한다.
순수한 함수(Pure function)
부작용(side-effect)이 없는 함수. 즉, 함수의 실행이 외부에 영향을 끼치지 않는 함수를 뜻한다. 따라서 순수한 함수는 Thread-safe하며, 병렬적인 계산이 가능하다.
y = f(x) * f(x); // f is Pure function
f가 pure function인 경우 y는 항상 결과 값이 같다.
y = random() * random();
이와 같이 pure function이 아닐 경우 y값이 항상 달라질 수 있는데, 이는 부작용을 발생시키는 함수이다.
익명 함수(Anonyous function)
이름이 없는 함수를 뜻한다.
[](int x) -> int { retrn x*x; }
고계 함수(higher-order function)
고차 함수는 함수를 인자로 전달받거나 함수를 결과로 반환하는 함수를 말한다. 정수를 함수의 인자로 전달 할 수 있듯이 어떤 함수도 다른함수의 인수로 전달할 수 있다. 마찬가지로 함수의 결과 값으로 정수를 반환할 수 있듯이 함수를 반환할 수도 있다.
map(x-> x*x)[1..10]