C++11부터 도입된 람다식(Lambda Expression)은 함수를 별도로 선언하지 않고 코드 중간에 즉석에서 정의하여 사용할 수 있는 익명 함수다.
코드를 간결하게 만들고 로직의 집중도를 높이는 데 효과적이다.
람다식의 기본 구조
람다식은 [캡처](매개변수) -> 반환타입 { 본문 } 형식을 가진다.
반환 타입은 생략 가능하다.
#include <iostream>
#include <vector>
#include <algorithm>
int main() {
// 1. 가장 단순한 형태의 람다
auto hello = []() { std::cout << "Hello, Lambda!" << std::endl; };
hello();
// 2. 매개변수와 반환값이 있는 람다
auto add = [](int a, int b) -> int {
return a + b;
};
std::cout << "Sum: " << add(10, 20) << std::endl;
return 0;
}
캡처 절 (Capture Clause)
람다식 외부의 변수를 내부에서 사용하기 위한 규칙이다.
[=]: 모든 외부 변수를 값으로 복사하여 캡처한다.
(읽기 전용)[&]: 모든 외부 변수를 참조로 캡처한다.
(수정 가능)[x, &y]: x는 값으로, y는 참조로 개별 지정하여 캡처한다.
int factor = 2;
std::vector<int> nums = {1, 2, 3, 4, 5};
// factor를 값으로 캡처하여 사용
std::for_each(nums.begin(), nums.end(), [factor](int& n) {
n *= factor;
});
STL 알고리즘과의 결합
람다식은 std::sort나 std::find_if 같은 알고리즘 함수와 함께 사용될 때 강력한 위력을 발휘한다.
struct Student {
std::string name;
int score;
};
std::vector<Student> students = { {"Kim", 80}, {"Lee", 95}, {"Park", 85} };
// 점수 기준 내림차순 정렬 (람다 사용)
std::sort(students.begin(), students.end(), [](const Student& a, const Student& b) {
return a.score > b.score;
});
// 90점 이상인 첫 번째 학생 찾기
auto it = std::find_if(students.begin(), students.end(), [](const Student& s) {
return s.score >= 90;
});
P.S
람다식은 일회성으로 사용되는 함수 객체를 생성하는 번거로움을 줄여준다.
함수를 데이터처럼 주고받는 현대적 프로그래밍 스타일을 C++에서 구현하기 위한 필수 문법인 것 같다.