함수형 프로그래밍
에서 가장 중요한 개념이 있습니다. 바로 순수 함수
인데요. 순수 함수
가 무엇인지에 대해 우선 알아보겠습니다.
순수 함수(pure function)
는 함수가 수행해야하는 기능 외에 다른 부수적 효과가 나타나지 않는 함수를 의미합니다. 이것을 함수가 부작용이 없다라고 표현하기도 합니다. 또한 함수 내부에서 데이터 변화가 일어나지 않고, 전역 상태가 존재하지 않는 함수이기도 합니다. 순수 함수
에 반하는 용어로 다른 부수적 효과가 발생하는 함수를 불순 함수(impure function)
이라고 합니다.
순수 함수
를 만드는 방법은 함수를 작성할 때 순수 함수의 조건들을 지키거나, 불순 함수에 순수 함수 규칙을 적용시켜 부작용을 없애는 방식으로 만듦니다. 순수 함수 조건
은 다음과 같습니다.
순수 함수
는 작성하기 까다롭지만 함수의 동작을 이해하기 쉽고, 결과 예측이 쉬워지기 때문에 유지보수성과 가독성이 높아지는 효과를 얻을 수 있다는 장점이 있습니다.
함수형 프로그래밍
은 선언형 프로그래밍과 순수 함수를 이용해 문제를 해결하는 프로그래밍 패러다임입니다. 선언형 프로그래밍과 순수 함수 덕에 코드가 간결해지고, 유지보수와 가독성이 크게 증가한다는 장점을 가지고 있습니다.
하지만, 선언형 프로그래밍의 특징인 높은 추상화 레벨로 인해서 선언형 프로그래밍에 익숙하지 않다면 코드를 작성하거나 읽는데 어려움을 느낄 수 있습니다. 또한 기존 방식과는 다른 방식의 패러다임이기 때문에 자료구조 등에서 차이가 발생할 수도 있습니다.
함수형 프로그래밍
은 Scala, Haskell, LISP 등의 언어로 작성할 수 있습니다. 자바스크립트, 그 오프셋인 타입스크립트는 함수형 프로그래밍을 어느정도 흉내낼 수는 있으나 완전한 함수형 프로그래밍
언어는 아닙니다.
함수형 프로그래밍
은 어떤 특징을 가지고 있길래 사용되는 언어들이 구분되고 있는걸까요? 함수형 프로그래밍
은 다음과 같은 특징을 가지고 있습니다.
함수형 프로그래밍
은 함수를 일등 시민(First-Class Citizens) 로 관리합니다. 일등 시민
은 함수 표현식(리터럴)을 가져서 변수와 함수를 따로 구분짓지 않는 것을 의미합니다. 변수와 함수를 구분 짓지 않는 다는 것을 통해 함수를 함수의 인수로 전달하기도 하고, 함수에서 함수를 반환할 수 있으며, 값의 할당과 변경이 자유로워지는 것을 의미합니다.
고차 함수(High-Order function)
은 함수에서 또 다른 함수를 반환하는 함수를 의미합니다. 고차 함수
를 사용하면 추상화를 더 높은 레벨로 끌어올릴 수 있고, 함수의 재사용성이 높아진다는 이점을 가집니다.
참조 투명성
은 함수에 어떤 값을 넣었을 때 반환되는 값이 항상 같은 것을 의미합니다. 동일한 값을 넣었을 때 매번 다른 값이 반환된다면, 다른 부가적 요소가 추가되어 불순 함수가 된다는 것 입니다. 그래서 함수형 프로그래밍
언어들은 참조 투명성
을 지킬 수 있는 요소들을 지원하기도 합니다.
커링
은 여러 인자를 받을 수 있는 함수를 분리해서, 인자를 하나씩 받는 함수 체인으로 만드는 것을 의미합니다. 다시 말해 n개의 인자를 받는 하나의 함수를 한 개의 인자를 받는 n개의 함수로 분리해서 값을 처리하도록 하는 기술입니다.
func(a, b, c)
->
func(a)(b)(c)