함수형 언어

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# 객체지향과 함수형을 함께 지원하는 혼합형
  • 자바의 람다식과 스트림, 파이썬의 람다·map·filter처럼 명령형 언어도 함수형 요소를 받아들이고 있다.

같이 보기

[편집 | 원본 편집]