함수형 언어
IT 위키
- Functional Language; 함수형 프로그래밍 언어
- 계산을 수학적 함수의 평가로 보고, 상태 변경과 가변 데이터를 피하는 프로그래밍 언어
- 명령형 언어가 "어떻게 계산할지"를 순서대로 지시한다면, 함수형 언어는 "무엇을 계산할지"를 식으로 선언한다.
- 1958년 LISP에서 시작했고, 이후 ML, Haskell, Erlang 등으로 이어졌다.
- 순수 함수(Pure Function) : 같은 입력에 대해 항상 같은 출력을 내며, 외부 상태를 바꾸지 않는다.
- 부수 효과(Side Effect) 없음 : 전역 변수 변경, 입출력 같은 외부 영향을 최소화한다.
- 불변성(Immutability) : 한 번 만든 값을 바꾸지 않고 새 값을 만든다. 할당문 대신 정의를 쓴다.
- 참조 투명성(Referential Transparency) : 식을 그 결과값으로 바꿔 써도 프로그램의 의미가 달라지지 않는다.
- 일급 함수와 고차 함수 : 함수를 값처럼 인수로 넘기고 반환할 수 있다. map, filter, reduce가 대표적이다.
- 재귀 : 반복문 대신 재귀로 반복을 표현한다.
- 지연 평가(Lazy Evaluation) : 값이 실제로 필요할 때 계산한다. 무한 자료구조를 다룰 수 있다.
- 커링(Currying) : 여러 인수를 받는 함수를 인수 하나씩 받는 함수들의 연쇄로 바꾼다.
- 장점
- 부수 효과가 없어 병렬·동시 처리에 유리하다. 공유 상태가 없으므로 경쟁 조건이 잘 생기지 않는다.
- 함수 단위로 독립적이어서 테스트와 검증이 쉽다.
- 코드가 짧고 선언적이어서 의도가 드러난다.
- 단점
- 상태 변화를 다루는 문제(입출력, 사용자 인터페이스)는 표현이 번거롭다.
- 재귀와 불변 데이터 때문에 메모리 사용량이 늘 수 있다.
- 명령형 사고에 익숙한 개발자에게 학습 부담이 있다.
| 언어 | 특징 |
|---|---|
| LISP | 1958년. 최초의 함수형 언어. 코드와 데이터가 같은 리스트 구조 |
| Scheme, Clojure | LISP 계열. Clojure는 JVM에서 동작한다 |
| ML, OCaml | 정적 타입과 타입 추론 |
| Haskell | 순수 함수형. 지연 평가를 기본으로 한다 |
| Erlang, Elixir | 경량 프로세스 기반의 동시성. 통신 시스템에 쓰인다 |
| Scala, F# | 객체지향과 함수형을 함께 지원하는 혼합형 |
