✅ 1. 람다 표현식이란?
람다(lambda) 표현식은 익명 함수(Anonymous Function) 를 생성할 수 있는 기능으로, 함수 객체보다 간결하게 함수를 정의하고 사용할 수 있도록 지원합니다.
📌 람다의 주요 특징:
✔ 이름이 없는 함수(익명 함수)
✔ 즉시 정의 및 호출 가능
✔ 변수 캡처 기능 (클로저)
✔ std::function과 함께 활용 가능
✅ 2. 기본 문법
[캡처](매개변수) -> 반환타입 { 함수 본문 };
📌 각 부분 설명:
- [캡처] : 외부 변수 사용 방법 지정
- (매개변수) : 입력값 (함수 매개변수와 동일)
- -> 반환타입 : 함수의 반환 타입 (생략 가능)
- { 함수 본문 } : 람다의 실행 코드
✅ 3. 람다 기본 사용법
#include <iostream>
int main() {
auto add = [](int a, int b) -> int { return a + b; };
std::cout << add(3, 4) << std::endl; // 7
}
✅ 설명:
- [](int a, int b) -> int { return a + b; }
- 두 개의 정수를 받아 더한 값을 반환하는 람다
📌 반환 타입 생략 가능 (자동 유추)
auto add = [](int a, int b) { return a + b; };
✅ 4. 캡처(Capture)
람다는 외부 변수를 캡처할 수 있습니다.
캡쳐 방식 | 설명 |
[=] | 모든 외부 변수를 값(value) 캡처 |
[&] | 모든 외부 변수를 참조(reference) 캡처 |
[x] | 변수 x만 값(value) 캡처 |
[&x] | 변수 x만 참조(reference) 캡처 |
[=, &y] | 기본적으로 값 캡처, y만 참조 캡처 |
[&, x] | 기본적으로 참조 캡처, x만 값 캡처 |
📌 값 캡처 (Copy Capture)
#include <iostream>
int main() {
int x = 10;
auto lambda = [=]() { std::cout << x << std::endl; };
lambda(); // 10
}
✅ 설명:
- [=]을 사용하면 외부 변수 x가 복사(copy) 되어 람다 내부에서 사용됨.
- x가 변경되더라도 람다 내부의 값은 영향을 받지 않음.
📌 참조 캡처 (Reference Capture)
int main() {
int x = 10;
auto lambda = [&]() { x += 5; };
lambda();
std::cout << x << std::endl; // 15
}
✅ 설명:
- [&]을 사용하면 외부 변수 x를 참조(reference) 하므로 직접 수정 가능.
📌 혼합 캡처
int main() {
int a = 10, b = 20;
auto lambda = [=, &b]() { b += a; };
lambda();
std::cout << b << std::endl; // 30
}
✅ 설명:
- a는 값 캡처 (수정 불가), b는 참조 캡처 (수정 가능).
✅ 5. 람다와 std::function
람다는 std::function을 활용하여 저장 가능.
#include <iostream>
#include <functional>
int main() {
std::function<int(int, int)> add = [](int a, int b) { return a + b; };
std::cout << add(5, 6) << std::endl; // 11
}
✅ 설명:
- std::function<int(int, int)>을 사용해 람다를 저장 후 호출 가능.
✅ 6. 람다를 이용한 정렬
람다는 STL과 함께 사용하여 코드 간결화 가능.
#include <iostream>
#include <vector>
#include <algorithm>
int main() {
std::vector<int> v = {3, 1, 4, 1, 5, 9};
std::sort(v.begin(), v.end(), [](int a, int b) { return a > b; }); // 내림차순 정렬
for (int n : v) std::cout << n << " "; // 9 5 4 3 1 1
}
✅ 설명:
- std::sort의 비교 함수로 람다 사용하여 내림차순 정렬.
✅ 7. 람다를 반환하는 함수
람다를 반환할 수도 있음.
auto getLambda() {
return [](int x) { return x * x; };
}
int main() {
auto square = getLambda();
std::cout << square(5) << std::endl; // 25
}
✅ 설명:
- getLambda() 함수는 제곱을 계산하는 람다를 반환.
✅ 8. mutable 람다 (값 캡처 후 변경 가능)
람다에서 값 캡처를 했을 경우에도 내부에서 값을 변경하고 싶다면 mutable 키워드 필요.
int main() {
int x = 10;
auto lambda = [=]() mutable { x += 5; std::cout << x << std::endl; };
lambda(); // 15
std::cout << x << std::endl; // 10 (외부 변수에는 영향 없음)
}
✅ 설명:
- mutable을 사용하면 캡처된 변수를 변경 가능하지만 외부 변수에는 영향을 주지 않음.
✅ 9. 람다의 타입 (auto 사용)
람다는 고유한 타입을 가짐. 따라서 auto를 이용해야 저장 가능.
auto lambda = [](int a, int b) { return a + b; };
📌 타입을 지정하려면 std::function 사용
std::function<int(int, int)> lambda = [](int a, int b) { return a + b; };
🔥 정리
✅ C++ 람다 표현식은 간결하고 강력한 익명 함수
✅ 캡처 기능을 통해 외부 변수 활용 가능 ([=], [&], [x])
✅ STL과 조합하여 강력한 활용 가능 (std::sort, std::function)
✅ 값 캡처 후 변경하려면 mutable 키워드 필요
✅ 반환 타입을 자동 추론 가능 (명시적 -> 지정 가능)
📌 C++11부터 도입, C++14, C++17에서 기능 확장됨! 🚀
반응형
'프로그래밍 > C,C++' 카테고리의 다른 글
[Modern C++] string_view (0) | 2025.04.02 |
---|---|
[Modern C++20] 삼중 비교 연산자(Three-Way Comparison) (0) | 2025.03.28 |
[Modern C++] decltype (0) | 2025.03.25 |
[Modern C++] STL 자료구조 (0) | 2025.03.24 |
[Modern C++] std::atomic (1) | 2025.03.21 |