2 minute read


이 포스트에서는 개인적 궁금증을 해소하기 위해 아주 간단하게 함수형 프로그래밍을 알아봅니다. 나중에 다시 제대로 공부해볼 생각입니다. updated at 2022-04-06


함수형 프로그래밍이란?

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

함수형 프로그래밍명령형 프로그래밍이 주요 초점을 “해결 방법” 에 두는 것과 달리, “해결할 내용” 에 둔다. 때문에 명령문 대신 표현식을 사용한다. 표현식 은 값을 생성하기 위해 평가되는 반면, 명령문 은 변수를 할당하기 위해 실행된다.

명령형 프로그래밍 에서는 상태를 바꾸는 것을 강조하는 것과 달리, 함수형 프로그래밍 은 함수의 응용을 강조한다. 프로그래밍이 이 아닌 식이나 선언으로 수행되는 선언형 프로그래밍 패러다임을 따르고 있다.

명령형의 함수 는 프로그램의 상태의 값을 바꿀 수 있는 부작용이 생길 수 있다. 이 때문에 명령형 함수는 참조 투명성이 없고, 같은 코드라도 실행되는 프로그램의 상태에 따라 다른 결과값을 낼 수 있다.

반대로 함수형 코드 에서는 함수의 출력값은 함수의 출력값은 그 함수에 입력된 인수에만 의존하므로, 인수 x 에 같은 값을 넣고 함수 f 를 호출하면 항상 f(x) 라는 결과가 나온다.
부작용을 제거하면 프로그램의 동작을 이해하고 예측하기가 훨씬 쉽게 된다.
이것이 함수형 프로그래밍으로 개발하려는 핵심 동기중의 하나이다.

함수형 프로그래밍의 개념

  • 순수 함수
  • 재귀
  • 참조 투명성
  • 함수는 일급이며 고차일 수 있다.
  • 변수는 변경할 수 없다.

순수한 함수

순수한 함수 란, 부작용 이 없는 함수, 즉 함수의 실행이 외부에 영향을 끼치지 않는 함수를 뜻한다. 따라서 순수한 함수는 스레드 안전 하고, 병렬적인 계산이 가능하다.

y = f(x) * f(x); 여기서 f가 순수한 함수라면,
z = f(x);
y = z * z;  같이 최적화   있다.
이러한 최적화는 함수의 재연산을 방지하면서  같은 결과 반환하게 된다.

그러나 f가 부작용을 발생시키는 함수라면, 위와 같이 최적화 할 수 없다. 같은 값이 인수로 주어지더라도 다른 결과가 나올 수 있기 때문이다.

순수한 함수에는 다음과 같은 두가지 주요 속성이 있다.

  1. 순수한 함수는 동일한 인수에 대해 항상 동일한 출력을 생성한다.
  2. 부작용이 없다. 즉, 인수 또는 지역/전역 변수 또는 입력/출력 스트림을 수정하지 않는다.
    이 두번째 속성을 불변성 이라고 한다. 순수 함수의 유일한 결과는 반환하는 값이다.

순수 함수를 사용하면,
부작용이나 숨겨진 I/O가 없기 때문에 디버그 하기가 쉽고,
병렬/동시 응용 프로그램을 더 쉽게 작성할 수 있도록 한다.

재귀

함수형 언어에는 “for” or “while” 루프가 없다. 함수형 언어의 반복은 재귀를 통해 구현된다. 재귀 함수는 기본 사례에 도달할 때까지 반복적으로 자신을 호출한다.

참조 투명성

기능 프로그램에서 변수는 한 번 정의되면 프로그램 전체에서 값을 변경하지 않는다. 기능적 프로그램에는 할당문이 없다. 값을 저장해야 하는 경우 새로운 변수를 정의한다. 이것은 모든 변수가 실행 시점에서 실제 값으로 대체될 수 있기 때문에 부작용의 가능성을 제거한다. 모든 변수의 상태는 항상 일정합니다.

익명 함수

전통적인 명령형 언어에서는 모든 함수에 이름이 부여되어야만 한다.
그러나 함수형 언어에서는 익명 함수 의 작성이 가능하다.
하스켈에서는 익명 함수를 다음과 같이 작성한다.

\x -> x * x

고계 함수

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

map (\x -> x * x) [1...10]
반환값은 다음과 같다.
[1,4,9,16,25,36,49,64,81,100]

변수는 변경할 수 없다.

함수형 프로그래밍에서는 초기화된 변수를 수정할 수 없다. 새로운 변수는 생성할 수 있지만 기존 변수를 수정할 수는 없으며, 이는 프로그램 실행 시간동안 상태를 유지하는데 큰 도움이 된다. 변수를 만들고 값을 설정하면 해당 변수의 값이 절대 변경되지 않을 것이라는 확신을 가질 수 있다. 함수형 프로그래밍 in Wikipedia 함수형 프로그래밍 in GeeksForGeeks