728x90
그냥 함수를 쓰면 될 것 같은데 왜 귀찮게 Lambda 함수 쓰는지 알아보자
람다 함수 생김새를 살펴보자
일단 Lambda 함수의 문법을 보자
아주 요상하게 생겼다
[] () -> {...}
- [] : Captures the used variables
- () : Parameters
- -> : Return value
- {} : Function body
아직 뭔지 잘 모르겠다
함수랑 비슷하면서도 다르다
Function vs Function Object
Compiler는 람다함수 구현체를 Class instance 형태로 해석해요
해당 클래스에서 operator () 연산자를 재정의 하는게 핵심이죠
이 클래스의 객체를 생성한 것을 function object라고 불러요
만약, 아래의 람다 함수를 정의했다면
auto addObj = [](int a, int b){ return a + b; };
addObj(3, 4) == 7;
컴파일러는 아래와 같이 function object를 생성해 처리하는 것이죠
struct AddObj{
int operator()(int a, int b) const { return a + b; }
};
AddObj addObj;
addObj(3, 4) == 7;
Closure와 Capture []
Closure 라는 개념은 lambda와 별개로 원래 존재하던 개념이라고 해요
함수 + 그 함수가 실행될 때 필요한 환경(context) 을 묶은 것을 closure라고 부른데요
lambda 함수의 []가 closure 역할을 해요
[]에 넣어준 지역 변수 값들을 컴파일러는 function object의 클래스 멤버 필드로 추가해서 사용해요
#include <iostream>
#include <functional>
// 특정 값을 더하는 함수를 만들어 반환
std::function<int(int)> make_adder(int base) {
return [base](int x) {
return base + x;
};
}
int main() {
auto add_three = make_adder(3);
auto add_seven = make_adder(7);
std::cout << add_three(4) << std::endl; // 7 출력
std::cout << add_seven(8) << std::endl; // 15 출력
}
Generic lambda functions
C++ 14부터 추가 된 기능이에요.
람다 함수의 Parameters를 auto로 받는다면 마치 function template처럼 사용 가능하죠
"Lambda is like function, Generic lambda is like function template"
auto add11=[ ](int i, int i2){ return i + i2; };
auto add14= [ ](auto i, auto i2){ return i + i2; };
람다를 사용 할 때 명심! 또 명심!
람다는 짧고 간결해야 해요
이름이 없기 때문에 딱 보고 무슨 동작을 하는지 이해가 쉬워야 하죠
Takeaway
- 람다 함수를 컴파일러는 Function Object 형태로 변환하여 사용한다는 사실이 놀라웠어요
- Closure가 원래 존재하던 개념이고 람다 함수에 적용되어 사용한다는 것을 알게 되었어요
728x90
'TIL > 2025' 카테고리의 다른 글
| [cpp] type_traits (0) | 2025.09.24 |
|---|---|
| [cpp] Request and Suppress (=default, =delete) (1) | 2025.09.08 |
| for 조건문 내 후위 연산자의 위험성 (1) | 2025.08.15 |
| Guard Clause를 통해 바라본 Clean Code와 MISRA Rule의 차이 (3) | 2025.08.15 |
| Data Structure & Algorithm (0) | 2025.07.25 |