<aside>
💡 Rober C.martin : Functional Programming is programming without assignment satements
</aside>
정의
- 자료 처리를 수학적 함수의 계산으로 취급하고 상태와 가변 데이터를 멀리하는 프로그래밍 패러다임의 하나. 함수의 응용을 강조한다.
- 함수를 변수, 인수 및 반환 값으로 사용하며 언어 지원을 활용하여 프로세스에서 깔끔한 코드를 생성한다. 이 때 불변 데이터를 사용하고 공유 상태를 피한다.
- 명령문 실행보다는 선언과 표현식에 중점을 둔다. 함수는 1급 객체(시민)으로 취급된다.
- ⇒ 함수는 인수로 전달하고, 다른 함수에서 반환하고, 이름에 연결할 수 있으며 참조 투명성을 지킬 수 있다.
- 표현식은 값을 생성하기 위해 평가되는 반면 명령문은 변수를 할당하기 위해 실행된다.
- 람다 미적분학에서 발전했다. 대표적인 함수형 프로그래밍 언어로는 Scheme, Common Lisp(CL), Ellxlr 등이 있다.
- 함수형 프로그래밍은 순수 함수 언어와 비순수 함수 언어로 나뉜다.
주요 특징
순수 함수(pure function)
- 순수 함수는 다른 것에 관계 없이 동일한 인수에 대해 항상 동일한 출력을 생성하는 함수다.
- 부작용(Side Effect)가 없다. 즉, 인수나 로컬/전역 변수 또는 입력/출력 스트림을 수정하지 않는다.
- 부작용 : 변수의 값이 변경되거나, 자료 구조를 제자리에서 수정하거나, 객체의 필드값을 설정하거나, 예외나 오류가 발생하여 실행이 중단되거나, 콘솔 또는 파일 I/O가 발생하는 작업
- 순수 함수는 스레드 안전하고, 병렬 계산이 가능하다.
- ⇒ 스레드 안전(Thread safety) : 멀티 스레드 프로그래밍에서 일반적으로 어떤 함수나 변수, 혹은 객체가 여러 스레드로부터 동시에 접근이 이루어져도 프로그램의 실행에 문제가 없음을 의미한다.
- 순수 함수의 유일한 결과는 반환하는 값이며, 그것들은 결정적이다.
익명 함수(anonymous function)
- 이름이 없는 함수를 의미한다.
- 전통적인 명령형 언어에서는 모든 함수에 이름이 부여되어야 하지만, 함수형 언어에서는 함수를 이름이 없는 익명 함수로 작성할 수 있다.
재귀
- 함수형 프로그래밍에는 for 또는 while 루프가 없다.
- 반복은 재귀를 통해 구현된다.
참조 투명성(Referential Transparency)