안녕하세요, 오늘은 C++ 프로그래밍에서 강력하면서도 유연한 기능 중 하나인 '람다(lambda)표현식'에 대해 배워볼 것입니다. 람다 표현식은 코드의 간결성과 가독성을 향상시키는 데 큰 역할을 하며, 특히 함수형 프로그래밍 패러다임에서는 핵심적인 역할을 합니다.
람다(lambda) 표현식이란?
람다(lambda)표현식은 이름 없는 함수, 즉 '익명 함수'를 정의할 수 있는 기능입니다. 이는 함수 객체를 생성하며, 일반 함수처럼 동작합니다. 람다(lambda)표현식은 C++11부터 지원되기 시작했으며, 기본적인 형태는 다음과 같습니다.
[캡처리스트](매개변수 리스트) -> 반환타입 { 함수 본문 }
람다(lambda)표현식의 각 요소
- 캡처 리스트 (Capture list): 외부 범위의 변수를 람다 표현식 내부로 가져오는 방법을 지정합니다.
- 매개변수 리스트 (Parameter list): 람다(lambda)표현식이 받을 매개변수를 지정합니다.
- 반환 타입 (Return type): 람다(lambda)표현식의 반환 타입을 지정합니다. 자동 유추가 가능하므로 생략할 수 있습니다.
- 함수 본문 (Function body): 람다(lambda)표현식이 수행할 작업을 정의합니다.
캡처 리스트 (Capture list):
- []: 아무것도 캡처하지 않습니다.
- [=]: 외부 범위의 모든 변수를 값으로 캡처합니다.
- [&]: 외부 범위의 모든 변수를 참조로 캡처합니다.
- [a, &b]: 'a'는 값으로, 'b'는 참조로 캡처합니다.
int a = 1;
int b = 2;
auto simple_lambda = [a, &b]() {
std::cout << "a: " << a << "\n";
std::cout << "b: " << b << "\n";
b++; // 'b' is captured by reference, we can modify it.
};
위의 람다(lambda)표현식에서는 'a'를 값으로, ''를 참조로 캡처하였습니다. 따라서 람다(lambda)표현식 내부에서 'b'의 값을 변경할 수 있지만, 'a'의 값을 변경할 수 없습니다. 이런 방식으로 캡처 리스트를 사용하면 외부 범위의 변수를 람다 표현식에서 유연하게 사용할 수 있습니다.
매개변수 리스트 (Parameter list):
람다(lambda)표현식은 일반 함수처럼 매개변수를 받을 수 있습니다. 매개변수의 타입과 이름을 지정하면 됩니다.
auto add_lambda = [](int a, int b) {
return a + b;
};
std::cout << "Result: " << add_lambda(5, 3) << "\n"; // 출력: "Result: 8"
위의 람다(lambda)표현식은 두 개의 정수를 매개변수로 받아 그 합을 반환합니다.
반환 타입 (Return type)
람다(lambda)표현식의 반환 타입은 '->' 연산자를 통해 지정할 수 있습니다. 하지만 대부분의 경우, 컴파일러가 반환 타입을 유추할 수 있으므로 생략하는 것이 일반적입니다. 만약 반환 타입을 지정하고 싶다면 다음과 같이 작성할 수 있습니다.
auto divide_lambda = [](double a, double b) -> double {
if (b == 0.0) {
std::cout << "Error: Division by zero!\n";
return 0.0;
}
return a / b;
};
std::cout << "Result: " << divide_lambda(10.0, 2.0) << "\n"; // 출력: "Result: 5"
위의 람다(lambda)표현식은 두 개의 double 값을 받아 나눗셈을 수행하고 그 결과를 반환합니다. 여기서 반환 타입을 명시적으로 지정하였습니다.
함수 본문 (Function body)
람다(lambda)표현식의 본문에는 람다가 수행할 작업을 작성합니다. 이 부분은 일반 함수의 본문과 동일하게 작동합니다.
이제 람다(lambda)표현식이 어떻게 구성되는지 이해했으니, 다양한 상황에서 람다(lambda)표현식이 어떻게 활용될 수 있는지 살펴보겠습니다.
람다(lambda)표현식의 활용
1. 알고리즘의 비교 함수로 사용
std::vector<int> numbers = {5, 2, 7, 3, 6};
std::sort(numbers.begin(), numbers.end(), [](int a, int b) {
return a > b; // 내림차순 정렬
});
여기서 람다 표현식은 std::sort 알고리즘의 비교 함수로 사용되었습니다. 람다 표현식을 이용하면 알고리즘에 바로 비교 함수를 전달할 수 있어 코드가 간결하고 명확해집니다.
2. 함수 객체를 만드는데 사용
auto multiply_by_2 = [](int num) {
return num * 2;
};
std::cout << "Result: " << multiply_by_2(5) << "\n"; // 출력: "Result: 10"
이 예제에서는 람다 표현식을 이용해 '곱하기 2'를 수행하는 함수 객체를 만들었습니다. 이 객체는 이후 필요할 때마다 재사용할 수 있습니다.
3. 콜백 함수로 사용
void perform_operation(std::function<int(int, int)> operation, int a, int b) {
std::cout << "Result: " << operation(a, b) << "\n";
}
perform_operation([](int a, int b) { return a + b; }, 5, 3); // 출력: "Result: 8"
이 예제에서는 람다 표현식을 이용해 콜백 함수를 정의하고 전달하였습니다. 이렇게 람다 표현식을 이용하면 콜백 함수를 쉽게 정의하고 사용할 수 있습니다.
댓글