함수형 프로그래밍을 안다면 람다표현식이 쉬울것이다.

하지만 C++ 11이전 버전만 사용하던 나에게... 개념이해가 어렵다..^_^...

다수의 구글링과 유튜브(https://www.youtube.com/channel/UCHcG02L6TSS-StkSbqVy6Fg)를 이용해 학습한 내용을 정리한다.

 

 

먼저 Java Script의 Closure개념에 대해 알아두면 좋을 듯 하다.

1.Closure의 정의

클로저는 자바스크립트 고유의 개념이 아니다. 클로저에 대해 MDN은 아래와 같이 정의하고 있다.

 

“A closure is the combination of a function and the lexical environment within which that function was declared.”
클로저는 함수와 그 함수가 선언됐을 때의 렉시컬 환경(Lexical environment)과의 조합이다.

Lexical환경 이란 아래와 같이 정의할 수 있다. = 내부 숨김 연관 객체(Internal Hidden Associated Object)

렉시컬  =  "사전의" "어휘의"

  • 실행중인 함수
  • 코드 블록 {...}
  • 스크립트 전체

즉 클로저는 함수와 그 함수가 선언된 환경과의 관계이다!

“함수”란 반환된 내부함수를 의미하고 “그 함수가 선언될 때의 렉시컬 환경(Lexical environment)”란 내부 함수가 선언됐을 때의 스코프를 의미한다.

 즉, 클로저는 반환된 내부함수가 자신이 선언됐을 때의 환경(Lexical environment)인 스코프를 기억하여 자신이 선언됐을 때의 환경(스코프) 밖에서 호출되어도 그 환경(스코프)에 접근할 수 있는 함수를 말한다.

클로저는 자신이 생성될 때의 환경(Lexical environment)을 기억하는 함수 이다

 

정의는 이쯤하고, 관련내용은 구글링을 하도록 한다..

 

 

2. 그래서 C++에서 Closure개념을 어떻게 사용하는데?

아래와 같은 코드를 보며 느낌을 이해해보자..

plus3 객체(Function Object) 는 localVar에 3 을 할당한 상태

plus5 객체는 localVar에 5를 할당한 상태 이다!

#include <iostream>
using namespace std;

//closer 랑 유사한 개념으로 접근해야한다

class Plus
{
public:
	//explicit 키워드 : 자신이 원하지 않은 형변환이 일어나지 않도록 제한하는 키워드
	explicit Plus(int a) :localVar{ a } {}
	//class로부터 만들어진 오브젝트를 호출이 가능한 오브젝트로 만들려면 function call operator를 오버로딩하면된다
	int operator() (int x) const
	{
		return localVar + x;
	}

private:
	int localVar;
};

int main()
{
	Plus plus3{ 3 };
	Plus plus5{ 5 };

	cout << plus3(10) << endl;
	cout << plus5(10) << endl;

}

 

3. Lambda Expression 

위 코드 중 Plus3은 정확히 아래와 같은 코드이다. (asm, memory map 동일)

	//캡쳐 모드
	auto lambdaplus3 = [localVar = 3](int x)
	{
		return localVar + x;
	};

 

복사했습니다!