반응형
C++에서 람다(lambda) 는 익명 함수(anonymous function) 라고 한다.
즉, 이름이 없는, 짧은 함수를 코드 안에서 바로 정의해서 바로 쓰는 것이다.
보통 우리가 함수를 만들 땐 이렇게 한다
bool compare(int a, int b) {
return a < b;
}
이건 “이름이 있는 함수(compare)”이다.
그런데 람다는 이름을 붙이지 않고 코드 안에서 즉석으로 만드는 함수이다.
[](int a, int b) {
return a < b;
}
이게 람다 함수(lambda function)
함수 이름이 없고, 대괄호 []로 시작한다는 게 특징이다.
람다 기본 문법
[capture](parameters) -> return_type {
// 함수 내용
}
- 대부분의 경우 리턴 타입은 자동 추론돼서 생략 가능하다.
- 타입이 복잡해서 auto나 템플릿으로 받는 게 일반적
[](int a, int b) {
return a < b;
}
보통 이렇게 많이 쓴다.
[ ] — 캡처(capture)의 의미
람다 문법의 맨 앞 [] 안에는 외부 변수를 가져올 수 있다.
int pivot = 10;
auto cmp = [pivot](int a, int b) {
return abs(a - pivot) < abs(b - pivot);
};
이렇게 하면 pivot 변수(= 외부 변수)를 람다 안에서 사용할 수 있다.
이걸 캡처(capture) 라고 한다.
예시
int pivot = 5;
vector<int> v = {1, 9, 3, 8};
sort(v.begin(), v.end(), [pivot](int a, int b) {
return abs(a - pivot) < abs(b - pivot);
});
→ pivot(=5)에 더 가까운 순서로 정렬됨.
| 형태 | 의미 |
| [ ] | 외부 변수 캡처 안 함 |
| [x] | 변수 x를 복사해서 사용 |
| [&x] | 변수 x를 참조(원본 변경 가능) |
| [=] | 외부 변수를 모두 복사 |
| [&] | 외부 변수를 모두 참조 |
[=] : 값으로 캡처 (Value Capture)
int x = 10;
auto f = [=]() { cout << x; }; // 값으로 복사
x = 20;
f(); // 여전히 10 출력
- 외부 변수 x의 값을 복사해서 람다 안에 저장
- 람다가 만들어진 시점의 값을 사용
- 원본 x를 바꿔도 람다 안의 값은 그대로
- 읽기 전용 (기본적으로 const)
특징
- 안전함 (원본 변수를 바꾸지 않음)
- 단점: 람다 생성 시 복사 비용이 있을 수 있음
[&] : 참조로 캡처 (Reference Capture)
int x = 10;
auto f = [&]() { cout << x; }; // 참조로 캡처
x = 20;
f(); // 20 출력
- 외부 변수 x를 참조(원본 주소) 로 캡처
- 람다 안에서 원본 변수에 접근함
- 따라서 원본이 바뀌면 람다에서도 바뀜
- 원본이 사라지면 Dangling Reference 위험 있음
특징
- 실시간 값 반영
- 위험: 외부 변수가 소멸되면 참조 깨짐
값을 참조하기 때문에 람다 안에서 값을 바꾸면 바뀐 값이 그대로 밖에서도 적용 된다.
#include <iostream>
using namespace std;
int main() {
int x = 10;
auto f = [&]() {
x = 20;
cout << "람다 안 x: " << x << endl; // 람다 안 x: 20
};
f();
cout << "람다 밖 x: " << x << endl; // 람다 안 x: 20
}
주의할 점
- [&]로 캡처했는데 람다가 원본 변수보다 오래 살면 위험
→ dangling reference (죽은 참조) - 예를 들어, 지역 변수 참조를 들고 다른 스레드에서 쓰면 crash 날 수 있음
- 즉, “참조로 캡처한 람다”는 수명 관리에 신경 써야 함
부분 캡처 (혼합 사용)
int a = 1, b = 2, c = 3;
auto f = [=, &b]() {
// a와 c는 값으로, b는 참조로 캡처
cout << a << ' ' << b << ' ' << c;
};
- [=, &b] → 전체는 값 캡처인데, b만 참조로 예외 처리
- [&, a] → 전체는 참조 캡처인데, a만 값으로 예외 처리
캡처 안 한 변수는 접근 불가
int x = 10;
auto f = []() { cout << x; }; // 오류: x 캡처 안 함
- [ ] 안에 아무것도 없으면 외부 변수 접근 불가
- C++은 명시적으로 캡처해야만 외부 변수를 쓸 수 있음
심화편에서 계속...
반응형
'프로그래밍 언어 > C++' 카테고리의 다른 글
| C++ mutable (0) | 2025.11.03 |
|---|---|
| C++ 람다함수 심화편 (0) | 2025.11.03 |
| C++ struct와 class의 차이 (0) | 2025.10.04 |
| C++ string compare 사용법 (0) | 2025.10.01 |
| C++ string 주요 멤버 함수 (0) | 2025.10.01 |
댓글