C++ 람다 함수
C++11이 도입되면서 람다 함수는 C++ 프로그래머들에게 강력하고 유연한 도구가 되었습니다. 람다 함수는 익명 함수라고도 불리며, 코드를 간결하게 만들고 일시적인 함수 객체를 생성하는 데 유용합니다. 이번 글에서는 람다 함수의 기본 개념부터 고급 활용 방법까지 자세히 살펴보겠습니다.
람다 함수의 기본 개념
람다 함수는 함수 객체를 간단하게 정의할 수 있는 문법입니다. 다음은 기본적인 람다 함수의 형태입니다.
auto lambda = []() {
// 코드 블록
};
여기서 `[]`는 람다 시작을 나타내고, `()`는 매개변수 리스트, `{}`는 함수 본체를 나타냅니다. 람다 함수는 `auto` 키워드를 사용하여 변수에 할당할 수 있습니다.
기본적인 예제
먼저, 간단한 예제를 통해 람다 함수를 살펴보겠습니다.
#include <iostream>
int main() {
auto greet = []() {
std::cout << "Hello, World!" << std::endl;
};
greet(); // "Hello, World!" 출력
return 0;
}
위 예제에서 `greet`는 "Hello, World!"를 출력하는 람다 함수입니다. `greet()`를 호출하면 람다 함수가 실행됩니다.
매개변수와 반환 값
람다 함수는 일반 함수처럼 매개변수를 받을 수 있으며, 반환 값도 가질 수 있습니다.
#include <iostream>
int main() {
auto add = [](int a, int b) -> int {
return a + b;
};
int result = add(3, 4); // 7
std::cout << "Result: " << result << std::endl; // "Result: 7" 출력
return 0;
}
위 예제에서는 두 개의 정수를 더하는 람다 함수를 정의하고 있습니다. `-> int` 부분은 반환 타입을 명시합니다.
캡처 리스트
람다 함수는 외부 변수들을 캡처하여 사용할 수 있습니다. 캡처 리스트는 `[]` 안에 작성됩니다.
#include <iostream>
int main() {
int x = 10;
int y = 20;
auto add = [x, y]() {
return x + y;
};
int result = add(); // 30
std::cout << "Result: " << result << std::endl; // "Result: 30" 출력
return 0;
}
위 예제에서는 외부 변수 `x`와 `y`를 캡처하여 람다 함수 안에서 사용하고 있습니다.
값 캡처와 참조 캡처
캡처 리스트에는 값 캡처와 참조 캡처 두 가지 방식이 있습니다.
- 값 캡처: 외부 변수의 값을 복사하여 람다 함수 내에서 사용
- 참조 캡처: 외부 변수에 대한 참조를 람다 함수 내에서 사용
#include <iostream>
int main() {
int value = 10;
auto byValue = [value]() {
return value;
};
auto byReference = [&value]() {
return value;
};
value = 20;
std::cout << "By Value: " << byValue() << std::endl; // "By Value: 10" 출력
std::cout << "By Reference: " << byReference() << std::endl; // "By Reference: 20" 출력
return 0;
}
캡처 리스트의 다양한 사용법
람다 함수는 캡처 리스트를 통해 다양한 방법으로 외부 변수를 사용할 수 있습니다.
- `[=]`: 모든 외부 변수를 값으로 캡처
- `[&]`: 모든 외부 변수를 참조로 캡처
- `[this]`: 클래스의 멤버 변수를 캡처
- `[a, &b]`: 변수 `a`는 값으로, `b`는 참조로 캡처
고급 사용법
람다 함수는 함수 객체로 사용할 수 있으며, 표준 라이브러리와 함께 강력한 기능을 발휘합니다.
#include <algorithm>
#include <iostream>
#include <vector>
int main() {
std::vector<int> numbers = {1, 2, 3, 4, 5};
std::for_each(numbers.begin(), numbers.end(), [](int n) {
std::cout << n << " ";
});
// "1 2 3 4 5" 출력
return 0;
}
위 예제에서는 `std::for_each` 알고리즘을 사용하여 벡터의 각 요소를 출력하는 람다 함수를 전달하고 있습니다.
'Programming' 카테고리의 다른 글
JWT (JSON Web Token)? (0) | 2024.06.09 |
---|---|
MongoDB와 SQL: 명령어 비교 (0) | 2024.06.09 |
C++ 벡터(Vector) 초기화 (0) | 2024.06.05 |
__VA_ARGS__ 가변인자 (0) | 2024.06.05 |
우분투에 Doxygen 설치 방법 (0) | 2024.06.05 |