C++에서 람다(Lambda) 함수는 익명 함수(Anonymous Function) 또는 즉석 함수(Inline Function)를 정의할 수 있는 기능입니다. C++11에서 도입되었으며, 코드를 간결하게 작성하고, 간단한 함수가 필요한 경우 즉석에서 정의할 수 있습니다. 람다는 특히 STL 알고리즘 함수와 함께 사용할 때 유용합니다.
기본 구문
람다의 기본 구조는 다음과 같습니다.
[capture](parameters) -> return_type {
// 함수 본체
}
- capture: 외부 변수를 캡처하는 방법을 정의하며, [&] (모든 변수 참조 캡처), [=] (모든 변수 복사 캡처), [x] (특정 변수 복사 캡처)와 같은 방식이 있습니다.
- parameters: 함수의 매개변수를 정의합니다.
- return_type: 반환 타입을 지정하며, 생략 가능하고, 컴파일러가 자동으로 추론할 수 있습니다.
- 함수 본체: 함수가 수행할 작업을 정의합니다.
예제
기본적인 람다 사용
#include <iostream>
int main() {
auto hello = []() {
std::cout << "Hello, World!" << std::endl;
};
hello(); // "Hello, World!" 출력
return 0;
}
매개변수가 있는 람다
#include <iostream>
int main() {
auto add = [](int a, int b) {
return a + b;
};
std::cout << add(3, 4) << std::endl; // 7 출력
return 0;
}
외부 변수 캡처
#include <iostream>
int main() {
int x = 10;
auto print_x = [&]() {
std::cout << "x: " << x << std::endl;
};
print_x(); // x: 10 출력
return 0;
}
복합 캡처
#include <iostream>
int main() {
int a = 1, b = 2;
auto sum = [a, &b]() {
return a + b; // a는 복사, b는 참조로 캡처
};
b = 3; // b 값을 변경
std::cout << sum() << std::endl; // 4 출력 (1 + 3)
return 0;
}
고급 사용 예시
람다는 STL 알고리즘 함수와 함께 사용하면 코드의 가독성과 간결성을 높일 수 있습니다. 예를 들어, std::for_each와 함께 사용할 수 있습니다.
#include <iostream>
#include <vector>
#include <algorithm>
int main() {
std::vector<int> numbers = {1, 2, 3, 4, 5};
// 람다를 사용해 요소 출력
std::for_each(numbers.begin(), numbers.end(), [](int n) {
std::cout << n << " ";
});
std::cout << std::endl;
return 0;
}
람다 표현식에서 반환 타입 명시
람다는 복잡한 연산을 수행할 때 반환 타입을 명시해야 할 경우가 있습니다. 이를 위해 -> 뒤에 반환 타입을 지정할 수 있습니다.
#include <iostream>
int main() {
auto divide = [](int a, int b) -> double {
return (b != 0) ? static_cast<double>(a) / b : 0.0;
};
std::cout << divide(10, 3) << std::endl; // 3.33333 출력
return 0;
}
람다 캡처 리스트에서 변수 수정
캡처 리스트에서 외부 변수를 복사하여 가져오는 경우, 기본적으로 변수는 const로 처리됩니다. 변경이 필요할 경우 mutable 키워드를 사용할 수 있습니다.
#include <iostream>
int main() {
int count = 0;
auto increment = [count]() mutable {
count++;
std::cout << "Count: " << count << std::endl;
};
increment(); // Count: 1
increment(); // Count: 2
std::cout << "Original count: " << count << std::endl; // 0 출력
return 0;
}
std::function과의 조합
람다 함수는 std::function과 함께 사용하여 더 유연한 함수 객체로 활용할 수 있습니다. 특히 재귀적인 람다 함수 정의에 유용합니다.
#include <iostream>
#include <functional>
int main() {
std::function<int(int)> factorial = [&](int n) {
return (n <= 1) ? 1 : n * factorial(n - 1);
};
std::cout << "5! = " << factorial(5) << std::endl; // 120 출력
return 0;
}
결론
람다 함수는 코드의 간결성과 가독성을 높여주는 C++의 중요한 기능입니다. 다양한 캡처 방식을 제공해 외부 변수의 제어 권한을 세밀하게 설정할 수 있으며, 특히 STL 알고리즘과 함께 사용하면 코드가 간결해집니다. std::function과의 조합, mutable 키워드, 반환 타입 명시 등을 통해 람다 함수를 더욱 강력하게 활용할 수 있습니다.
'C++' 카테고리의 다른 글
[C++] noexcept (0) | 2024.11.11 |
---|---|
[C++] 람다 함수의 클로저 타입 (0) | 2024.11.10 |
[C++] maybe_unused (1) | 2024.11.08 |
[C++] noreturn함수 (0) | 2024.11.07 |
[C++] 범위기반 for문 (4) | 2024.11.06 |