C++에서 함수형 프로그래밍을 지원하기 시작한 배경
C++ 언어의 스타일은 OOP, 즉 객체 중심 언어이다.
그런데 시간이 지나며 새로운 언어들이 생기고, 그런 새 언어들이 C++보다 더 쉽게 높은 언어 수준, 더 쉽게 OOP를 지원해주고 있다.
자연스럽게 C++는 OOP와 함께 높은 퍼포먼스가 필요한 곳에서 사용되어 왔다.
높은 퍼포먼스가 중요해지면 컴퓨터 구조상 자연스럽게 cach hit 을 계속 쳐줘야 한다.
cache hit을 계속적으로 쳐주기 위해서는 data가 중심이 되는 data oriented programming 스타일이 자연스럽게 C++로 들어오게 되고,
자연스럽게 C++11부터 함수형 프로그래밍의 핵심 기능인 람다식 Lamda Expression을 지원해주기 시작했다.
그러면서 C++가 어느 정도는 함수형 프로그래밍을 지원해주게 된 것이다.
함수형 프로그래밍의 핵심인 함수들을 객체나 변수처럼 다룰 수 있는 등의 함수형 프로그래밍의 특징과 장점들이 생긴 것이다.
참고로 함수형 프로그래밍을 가장 잘 다루는 언어는 자바 스크립트다.
자바 스크립트 함수형 프로그래밍 사용 예시
자바 스크립트를 실행하는 간단한 방법은,
인터넷 브라우저를 키고 개발자 도구 툴을 열면 된다.
plus (a) 함수를 정의했다.
이 함수는 내부적으로 localVar을 저장하고 어떤 함수 function(x)를 리턴해 주는데
이 함수 function(x)는 localVar + x 를 리턴해 주는 함수이다.
이렇게 되면 plus3, plus5 라는 변수를 만든 것 같지만 실제로는 plus3과 plus5는 함수가 되는 것이다.
이렇게 plus3(10) 하면 13을 리턴해 주고
plus5(10) 이면 15를 리턴해 준다.
이렇게 해서 얻는 장점은,
plus3 함수를 정의하고 plus5라는 함수를 정의하게 되는데 이 안에는 localVar 내부 변수가 있다.
이런 함수가 한번 정해지면 plus3이라는 함수는 오직 3을 더해주는 함수로만 기능해 주게 되고 내부 변수는 어떤 방법으로도 접근이 불가능해 진다.
또한 이렇게 함수를 변수처럼 다루게 되면 함수 자체를 다른 함수로 넘겨줄 수 있는 기능이 생기면서 call back function 또는 high order function을 다룰 수 있게 되는 것이다. 이 내용은 추후 다룰 것이고,
이 자바스크립트 코드에서 가장 중요한 부분은 함수를 리턴해주는 함수를 만들어 줌으로써 plus3 plus5와 같이 어떤 특정 기능만 하는 함수형 오브젝트를 만들었을 뿐만 아니라 이런 함수형 오브젝트를 일반 함수처럼 호출할 수 있다는 것이다.
이런 테크닉을 closer 클로져라고 하는데 C++에서도 클로져 기능을 만들어 낼 수 있다.
C++ Closer _ 함수형 프로그래밍
#include <iostream>
class Plus
{
public:
explicit Plus(int a) : localVar{ a } {}
int operator() (int x) const
{
return localVar + x;
}
private:
int localVar;
};
int main()
{
Plus plus3{ 3 };
Plus plus5{ 5 };
std::cout << plus3(10) << std::endl;
std::cout << plus5(10) << std::endl;
return 0;
};
Plus 클래스를 정의해 준 후, 로컬변수 int localVar 을 선언하고,
컨스트럭터로 int a 를 받아서 localVar에 넣어준다.
클래스로부터 만들어지는 오브젝트를 호출이 가능한 오브젝트로 만들어 주기 위해서는
아주 간단하게
function call operator overloading 오퍼레이터 오버로딩을 해주면 된다.
함수의 내용은 방금 위에서 자바스크립트에 썼던 것처럼 localVar + x 를 더해서 리턴해 주자.
메인함수에서 plus3 오브젝트 plus5 오브젝트를 만들 수 있다.
plus3 오브젝트는 호출이 가능한 오브젝트이기 때문에 간단하게 함수를 호출하는 것처럼 오브젝트를 불러주고 10을 넣어줄 수 있다.
plus 5 오브젝트에도 10을 넣어서 실행해 보면 13, 15가 나온다.
아까 자바스크립트에서는 함수 안에서 새로운 함수를 만들었다면
C++에서는 클래스를 사용해서 일반적인 함수처럼 작동이 가능한 오브젝트들을 만들어 낸 것이다.
이런 오브젝트를 function object이고,
이런 function object는 functional programming의 가장 핵심적인 개념인 함수를 오브젝트 또는 변수처럼 다룰 수 있게 되는 것이다.
위의 function object plus3 과 function object plus5는 함수처럼 보이지만 오브젝트라는 사실을 알고 있어야 한다!
연산자 오버로딩이 헷갈린다면 다음 글을 참고하고 올 것.
C++ Operator Overloading 연산자 오버로딩