[0]
함수형 프로그래밍에 대해 알아보자. 특장점을 위주로 간략히 개요를 알아본다.
[1]
우선 함수형 언어는 기본적으로 모든 변수가 immutable이다. 무슨 말이냐면, 한번 x = 3으로 선언하고 나면, 이 값을 바꿀 수 없다는 말이다. 즉 x = 4와 같은 구문은 x를 4로 바꾸는 게 아니라 기존의 x를 파괴하고 새로운 x를 4로 만드는 것과 같다. 절차 지향적 언어에 익숙하다면 이게 무슨 해괴망측한 일인지 싶지만 이로 인해 상당한 장점을 누릴 수 있다. 우선 '변수'의 개념이 없기 때문에 오브젝트를 공유하기가 쉽고 race condition이 발생하지 않는다. 또한 디버깅이 쉽고 [2]와 더불어 컴파일러 단의 최적화에 유리하다.
[2]
함수형 언어에는 순수 함수(pure function)를 지원한다. 이는 수학의 함수와 유사하게 입력값이 동일하다면 항상 리턴값이 같음을 보장한다. 즉 함수 실행 시에 side effect가 없음을 보장할 수 있다. 덕분에 몇 가지 장점들이 생기는데 다음과 같다.
- 함수의 결과가 사용되지 않는다면, 함수를 아예 실행하지 않을 수 있다.
- 함수 호출을 언제나 constant로 대체할 수 있다. 즉 fn(x,y)를 언제나 z로 대체할 수 있다. 이를 이용한 memoization도 가능하다.
- 프로그램 전체가 pure function으로 이루어져 있다면, 함수 호출의 순서를 어떤 방식으로든 재배치하거나, 병렬 실행할 수 있다.
[3]
함수형 언어의 순수 함수는 또한 1급 객체(first-class)로 취급된다. 1급 객체란, 변수에 할당하거나 함수에 파라미터로 넘기거나 리턴값으로 반환하거나 하는 등이 가능한 객체를 일컫는다. 즉 함수 자체를 클래스나 primitive type처럼 하나의 오브젝트로 취급하는 게 가능하다. 이를 통해 고차 함수를 만들거나 익명 함수를 파라미터로 전달하는 등의 동작이 가능해진다.
[3]
함수형 언어에서는 iteration을 지양하고 재귀를 사용한다. 물론 절차형 언어에서도 반복문 대신 재귀를 사용할 수 있긴 하다. 하지만 스택 프레임으로 인한 메모리 오버헤드 때문에 일반적으론 반복문을 사용한다. 하지만 함수형 언어에선 꼬리 재귀(tail recursion)라는 강력한 기능덕에 메모리 오버헤드 없이 사용할 수 있다. 더군다나 [2]에서 언급한 memoization이 기본적으로 제공되는 것은 덤이다.
[참고]
en.wikipedia.org/wiki/Functional_programming
'Computer Science > General' 카테고리의 다른 글
비동기적(asynchronous) 실행과 동기적(synchronous) 실행의 차이 (0) | 2020.02.20 |
---|---|
pass-by-value 와 pass-by-reference (0) | 2020.01.03 |
Container와 VM의 차이 (0) | 2019.12.16 |
메모리 : 힙과 스택의 차이 (0) | 2019.10.15 |
c++에서 레퍼런스와 포인터의 차이 (0) | 2019.09.22 |