람다의 구성

람다는 위 그림과 같이 4 개의 부분으로 구성되어 있다.
그 4 개의 부분은 각각 개시자 (introducer), 인자(parameters), 반환 타입 (return type), 그리고 함수의 몸통 (statement) 라 한다.
일단, 람다 맨 처음에 나타나는 [] 는 개시자로, 그 안에 어떤 외부 변수를 써 넣는다면 람다 함수가 이를 캡쳐 해서, 이 변수를 람다 내부에서 이용할 수 있게 된다. 위 경우 my_mod 라는 변수를 람다 내부에서 이용할 수 있게 된다.
그 다음의 () 는 람다가 실행시 받을 인자들을 써 넣는다. 위 람다는 int 형의 v_ 를 인자로 받는다. 여기는 그냥 실제로 함수에서 사용하는 인자 리스트와 동일하게 적어주면 된다.
이제, 그 옆으로 보면 -> 가 있고 반환 타입을 적어주시면 된다. 위 람다의 경우 int 를 리턴한다.
마지막으로 람다 내부에서 실행할 내용을 적어주면 되는데, 위 람다의 경우 v_ 와 my_mod 를 모듈러 연산해서 그 결과를 리턴한다.
람다함수는 런타임시에 이름은 없지만, 메모리 상에 임시적으로 존재하는 클로져 객체를 생성한다. 클로져 객체는 함수 객체처럼 동작한다.
[]() { cout << "foo" << endl; }()
를 실행하였을 때
[]() { cout << "foo" << endl; }
로 임시적인 클로져 객체가 생성되었는데 () 를 붙여서 바로 이 임시 클로져 객체를 실행시켜 버린다. 위 람다는 캡쳐 하는 변수들도 없고, 인자로 받는 것도 없고 리턴 타입도 없고 (참고로 리턴 타입이 void 일 경우 -> 를 생각 가능) 함수 몸통만 덜렁 있기에 특별히 생각할 것도 없이 함수 몸통만 덜렁 실행된다.
람다는 표현식은 런타임에 생성된 클로져로 동작을 실행하는데, 람다는 표현식이므로 클래스와 똑같다. 컴파일 타임에 생성이 완료되어야하고 런타임에 람다를 통해 클로져를 생성할 수 없다.
이건 Unreal의 Delegate에서 확인 가능한데 Dynamic Delegate는 Lambda를 받도록 설계되어 있지 않다. 클로져자체는 함수 객체처럼 동작하지만 런타임에 생성이 불가능하여 그런듯 하다. 따라서 Dynamic이 아닌 Delegate만 Lambda를 받을 수 있도록 설계되어 있다.
'C++' 카테고리의 다른 글
| __stdcall과 __cdecl (0) | 2024.01.26 |
|---|---|
| 객체 지향(OOP) (0) | 2023.10.02 |
| 좌측값(lvalue) & 우측값(rvalue) (0) | 2023.10.01 |
| Condition_Variable(조건 변수) (0) | 2023.09.30 |
| RAII(Resource Acguisition Is Initialization) (0) | 2023.09.30 |