# 함수형 프로그래밍 * 함수를 통해 참조 투명성을 보장하고, 상태와 가변 데이터 생성을 피하는 프로그래밍 패러다임. * 객체지향 프로그래밍에 대치되는 개념이 아니라 명령형 프로그래밍에 대치되는 개념. * 함수의 시초는 서브루틴: * 원래 서브루틴은 실행 흐름만 메인에서 서브로 왔다갔다 하는 정도. * 프로그래밍 언어가 발전하면서 함수와 유사하게 동작하는 서브루틴이 만들어짐. * 함수형 프로그래밍은 '함수와 유사한 서브루틴'을 '수학에서의 함수'와 동일하게 사용하는 프로그래밍 패러다임. * ['함수형 언어'의 정의?](https://twitter.com/simnalamburt/status/872282854784327681) > [@simnalamburt](https://twitter.com/simnalamburt) 참고로 PL 교수들은 어떻게 생각하냐면, 서울대 이광근교수님께선 함수형언어의 정의를 "1. First class function이면 함수형 언어다"라고 수업에서, 저서에서, 각종 발표에서 꾸준히 밀고계십니다. 이경우 js 파이썬 등 수많은 언어들이 함수형 언어로 편입됩니다. 카이스트 류석영교수님도 같은 정의를 쓰시는것으로 알고있어요. 저 정의가 아니면 사람들이 기존에 '뫄뫄 언어는 함수형언어다'라고 관습적으로 부르던것을 전부 만족하는것이 불가능합니다. > 함수형 프로그래밍은 자료 처리를 수학적 함수의 계산으로 취급하고 상태와 가변 데이터를 멀리하는 프로그래밍 패러다임의 하나이다. (Wikipedia) > 함수형 프로그래밍은 오직 순수 함수(pure function), 즉 부작용(side effect)이 존재하지 않는 함수만을 사용하여 프로그램을 구성하는 것을 전재로 한다. (Functional Programming in Scala) ## 특징 * pure function: * 동일한 인자에 대해 항상 동일한 값을 반환하는 함수. * 부수효과가 없는 함수. * immutable * referential transparency: * 프로그램 변경 없이 어떤 표현식을 값으로 대체할 수 있음. * 함수가 외부의 영향을 받지 않으며, 반환 결과는 파라미터에만 의존해야 함. * first class function: * 함수를 함수의 매개변수로 넘길 수 있다. * 함수를 함수의 반환값으로 돌려 줄 수 있다. * 함수를 변수나 자료구조에 담을 수 있다. * lazy evaluation ## 하위문서 * [[higher-order-function]]{고차 함수} * [[functional-type-system]]{함수형 타입 시스템} * [[functor]]{펑터} * [[applicative-functor]]{애플리케이티브 펑터} * [[monoid]]{모노이드} * [[monad]]{모나드} ## 참고자료 * 조재용, 우명인, [[functional-programming-in-kotlin]], 인사이트, 2019.