프로그래밍 패러다임
프로그래밍 패러다임(Programming Paradigm)은 프로그래머에게 프로그래밍의 관점을 갖게 하고, 결정하는 역할을 한다. 이러한 프로그래밍 패러다임은 다음과 같이 크게 두 가지로 나눌 수 있다.
명령형 프로그래밍 : 프로그래밍의 상태와 그것을 변경시키는 구문의 관점에서의 연산을 설명
절차적 프로그래밍 : 프로시저(Procedure)를 이용해 순차적인 처리를 중요시 여기는 패러다임
객체 지향 프로그래밍 : 객체들의 집합으로 프로그램의 상호작용을 표현
선언형 프로그래밍 : 어떻게(How) 할 것인가 보다는 무엇(What)을 할 것인가를 표현
함수형 프로그래밍 : 순수 함수(Pure Function)를 조합하고 프로그램을 만드는 방식
함수형 프로그래밍은 초창기부터 소프트웨어 개발의 한 흐름이었지만, 요즘날 그 중요성이 더욱 커지게 되었다
함수형 프로그래밍이란?
함수형 프로그래밍은 자료 처리를 수학적 함수의 계산으로 취급하고 상태와 가변 데이터를 멀리하는 프로그래밍 패러다임의 하나이다(위키백과)
함수는 코드 구성의 기본이며 모든 고차원 프로그래밍 언어에 존재한다. 일반적으로 함수형 프로그래밍은 깨끗(clean)하고 유지보수가 쉬운 소프트웨어를 만들기 위해 함수를 최상의 효과로 사용하는 것을 의미한다.
가끔 함수형 프로그래밍을 객체지향 프로그래밍(OOP) 혹은 절차적 프로그래밍의 반대 개념으로 생각하는 경우가 있다. 하지만 셋은 상호 배타적이지 않으며 대부분의 시스템은 이 세 가지 모두를 사용하는 경향이 있기 때문에 오해의 소지가 있다.
함수형 프로그래밍 언어로 분류되는 대표적인 언어로는 SQL, Scala, Clojure 등이 존재한다.
이러한 함수형 프로그래밍은 다음과 같은 특징들을 가진다.
함수형 프로그래밍 관련 용어 및 개념
함수형 프로그래밍 관련 용어들과 개념들을 통해 함수형 프로그래밍에 대해 이해해보자.
함수형 프로그래밍의 원칙 중 하나는 데이터를 함수 밖에서 변형(modify) 하지 않는 것이다. 다만, 함수의 반환 값(Return Value)은 함수 내에서 수행된 작업을 반영해야 한다.
이것은 부수 효과(Side Effect)를 방지할 수 있는 방법이며 함수의 영향에 대해 추론하는 것을 더 쉽게 만들어준다.
클로저란 부모 함수가 실행되었더라도 부모 함수의 변수에 접근할 수 있는 내부 함수(inner function)를 뜻한다.
함수형 프로그래밍의 이상(ideal)은 순수 함수라고 알려져있다. 순수 함수는 입력 파라미터에만 의존하며, 부수 효과를 일으키지 않는 함수를 뜻한다. 함수형 프로그래밍은 순수 함수를 통해 불변하는 데이터의 특징을 가질 수 있다.
이러한 순수 함수의 아름다움은 단순함에 있다. 순수 함수는 오직 인수(arguments)와 반환 값으로만 환원된다. 즉, 순수 함수는 정의된 API를 통해서만 외부 시스템과 상호 작용하여 결과를 만들어낸다. 쉽게 말해 정해진 입력 값을 주면 정해진 반환 값을 주기만 할 뿐, 부수 효과가 발생하지 않는 단순한 구조를 가지고 있는 것이다.
바로 이점이 객체 지향 프로그래밍(이하 OOP)과 다른 점이다. OOP는 객체의 메서드가 객체의 상태(혹은 객체의 멤버)와 상호작용하며 외부 상태가 함수 내에서 조작되고는 한다.
순수 함수라는 이상(ideal)을 넘어, 실제 함수형 프로그래밍은 일급 객체 함수에 의존한다. 일급 객체란 다음과 같은 특징을 가진 객체를 뜻한다.
함수형 프로그래밍에서 함수는 일급 객체로 취급된다. 따라서 일급 객체 함수란 일급 객체로 취급되는 함수를 뜻한다.
이러한 일급 객체 함수는 사용에 제한이 없기 때문에 프로그램 내 어디서든 사용할 수 있어 유연(flexible)하고 유용하다.
유지 관리 가능성이란 함수 밖에서 의도치 않게 어떠한 것이 바뀌지 않으므로(=부수 효과가 발생하지 않기 때문에) 프로그램을 유지 관리하기 용이하다는 뜻이다.
모듈화는 생산성을 증가시킨다. 작은 모듈은 빠르게 작성할 수 있으며 재사용하기 용이하여 프로그램 개발 속도를 높일 수 있다. 또한 모듈은 분리하여 테스트하기에도 유용하여 디버깅과 테스트 시간을 줄일 수 있다.
함수형 프로그래밍에서 함수는 항상 같은 동작을 진행한다. 따라서 프로그래머는 함수의 실행으로 인해 어떠한 결과를 반환할지 예측할 수 있다. 동일한 인자에 대해서는 항상 동일한 결과를 반환한다는 뜻으로 해석해도 된다.
함수형 프로그래밍의 장점과 한계
함수형 프로그래밍을 사용하면 다음과 같은 장점들이 존재한다.
함수형 프로그래밍은 그 유연성과 유용함을 인정받아 대표적인 OOP 언어인 JAVA와 C# 에서 조차 일급 객체 함수를 지원한다. Java 8에서부터 람다(Lamda)를 지원하는 것이 그 예이다.
하지만 다음과 같은 한계점도 존재한다.