함수형(functional) 프로그래밍

Rowan Lee·2023년 3월 3일

함수형(functional) 프로그래밍은 자료처리를 수학적 함수의 계산으로 취급하고 상태와 가변 데이터를 멀리하는 프로그래밍 패러다임의 하나이다.

명령형 프로그래밍은 상태를 바꾸는 것을 강조하지만, 함수형 프로그래밍은 함수의 응용을 강조한다. 상태와 가변 데이터를 멀리하기에 일종의 선언형 프로그래밍이다.

람다 대수(람다 연산)에 근간을 두고 있다.

함수형 언어로는 LISP등이 있다.

순수한 함수(Pure function)


명령형 프로그래밍에서의 함수와 함수형 프로그래밍(선언형 프로그래밍)의 함수의 차이는 무엇일까?(절차적 프로그래밍과의 차이이기도 하다.)

바로 함수형 프로그래밍은 순수 함수만을 활용한다.

// 순수 함수
  function func(a, b) {
            return a + b; // 인자로 들어온 값만 참조해, 리턴값을 생성
  }

int c = ?
  // 비순수 함수
  function func(a, b) {
            return a + b + c; // 외부 요인(c)에 따라 리턴값이 변경됨
  }

순수한 함수는 side-effect가 없는 함수, 즉 함수의 실행이 외부에 영향을 끼치지 않는 함수를 이야기한다. 아까 서술했던대로 상태와 가변변수를 멀리하기 때문에 이런 함수를 활용하는 것이다. 이 때문에 명령형 함수는 참조 투명성이 없고, 같은 코드라도 실행되는 프로그램의 상태에 따라 다른 결과값을 낼 수 있다. 반대로 함수형 코드에서는 함수의 출력값은 그 함수에 입력된 인수에만 의존하므로 인수 x에 같은 값을 넣고 함수 f를 호출하면 항상 f(x)라는 결과가 나온다. 부작용을 제거하면 프로그램의 동작을 이해하고 예측하기가 훨씬 쉽게 된다. 이것이 함수형 프로그래밍으로 개발하려는 핵심 동기중 하나이다.

순수한 함수의 특징

  • 스레드 안전
  • 병렬적인 계산 가능

익명함수


익명 함수(anonymous function)란, 이름이 없는 함수를 뜻한다. 전통적인 명령형 언어에서는 반드시 모든 함수에 이름이 부여되어야한다.
때문에 대표적인 전통 명령형 언어 C는 익명함수를 지원하지 않는다.이를 지원하는 언어들은 대부분 람다 표현식을 사용하곤 하는데 함수형 프로그래밍이 람다 대수가 발전한 형태임을 떠올릴 수 있다.

고계함수


고계 함수(higher-order function)란, 함수를 다루는 함수를 뜻한다. 사실 함수형 언어에서는 함수도 '값(value)'으로 취급한다. 그러므로 정수 1이나 인수를 제곱하는 함수나 동등한 입장에서 다룰 수 있다. 정수를 함수의 인수로 전달할 수 있듯이 어떤 함수도 다른 함수의 인수로 전달할 수 있다. 마찬가지로 함수의 결과 값으로 정수를 반환할 수 있듯이 함수를 반환할 수도 있다.

profile
CS/Software Engineer

0개의 댓글