학습
C++ Lambda 함수 사용법
C++ Lambda 함수 사용법 — 중급
Lambda 함수 사용법
1. 도입 (왜 배워야 하는가)
C++에서 Lambda 함수는 코드의 가독성과 재사용성을 높여주는 강력한 기능입니다. 실무에서는 데이터 처리, 이벤트 핸들링, 비동기 프로그래밍 등 다양한 상황에서 Lambda 함수를 활용하여 코드를 간결하게 작성할 수 있습니다. 만약 Lambda 함수의 개념을 이해하지 못한다면, 복잡한 코드 구조를 다루기 어려워지고, 코드의 유지보수 성격이 떨어질 뿐 아니라, 다른 개발자들과의 협업에서도 어려움을 겪게 될 수 있습니다. 따라서 Lambda 함수를 잘 이해하고 활용하는 것은 현대 C++ 프로그래머에게 필수적인 요소입니다.
2. 핵심 개념 설명
Lambda 함수는 무명 함수(익명 함수)로, 이름이 없는 즉시 사용할 수 있는 함수입니다. 이는 마치 요리사가 즉석에서 요리를 만들어 내는 것과 비유할 수 있습니다. 요리사는 레시피에 따라 즉석에서 요리를 만들 수 있지만, 정해진 요리 이름이 없는 것처럼, Lambda 함수도 이름이 없는 채로 정의되고 즉시 사용할 수 있습니다.
관련 용어 정리
| 용어 | 설명 |
|---|---|
| Lambda 표현식 | 함수를 정의하는 문법 |
| 캡처 | 외부 변수를 Lambda 함수 내부에서 사용하기 위해 가져오는 방법 |
| 반환 타입 | Lambda 함수가 반환하는 데이터 타입 |
3. 기본 코드 예제
아래는 가장 기본적인 Lambda 함수 사용 예제입니다.
#include <iostream>
int main() {
// Lambda 함수 정의
auto greet = []() {
std::cout << "안녕하세요, Lambda 함수입니다!" << std::endl;
};
// Lambda 함수 호출
greet(); // 함수 호출
return 0;
}
실행 결과:
안녕하세요, Lambda 함수입니다!
코드 한 줄씩 동작 설명:
#include <iostream>: C++의 표준 입출력 라이브러리를 포함합니다.int main() {: 프로그램의 시작점인 메인 함수를 정의합니다.auto greet = []() { ... };: 이름이 없는 Lambda 함수를 정의하고greet라는 변수에 할당합니다.std::cout << "안녕하세요, Lambda 함수입니다!" << std::endl;: Lambda 함수 내부에서 메시지를 출력합니다.greet();: 정의한 Lambda 함수를 호출합니다.return 0;: 프로그램을 정상적으로 종료합니다.- Lambda 함수는 이름이 없는 즉시 사용할 수 있는 함수로, 코드의 간결성을 높여준다.
- 캡처를 통해 외부 변수를 사용할 수 있으며, 이를 통해 유연한 코드 작성이 가능하다.
- 실무에서는 데이터 처리나 정렬, 이벤트 핸들링 등에 자주 사용된다.
- Lambda 함수는 C++11부터 도입되었으며, 다양한 문맥에서 활용 가능하므로 반드시 익혀야 한다.
4. 실전 활용 예제
예제 1: 벡터의 요소를 제곱하는 경우
쇼핑몰에서 상품 가격을 조정할 때, 가격을 제곱하는 과정을 Lambda 함수를 통해 쉽게 처리할 수 있습니다.
#include <iostream>
#include <vector>
#include <algorithm>
int main() {
std::vector<int> prices = {10, 20, 30, 40};
std::for_each(prices.begin(), prices.end(), [](int &price) {
price = price * price; // 가격을 제곱
});
for (const auto &price : prices) {
std::cout << price << " "; // 제곱된 가격 출력
}
return 0;
}
예제 2: 정렬 기준을 커스터마이징 하는 경우
사용자가 입력한 정렬 기준에 따라 리스트를 정렬할 때 Lambda 함수를 사용할 수 있습니다.
#include <iostream>
#include <vector>
#include <algorithm>
int main() {
std::vector<int> numbers = {5, 2, 8, 1, 3};
// Lambda 함수로 내림차순 정렬
std::sort(numbers.begin(), numbers.end(), [](int a, int b) {
return a > b; // 큰 수가 먼저 오도록 정렬
});
for (const auto &num : numbers) {
std::cout << num << " "; // 정렬된 숫자 출력
}
return 0;
}
5. 흔한 실수와 주의사항
실수 1: 캡처 구문을 잘못 사용하기
int x = 10;
auto lambda = [=]() { x++; }; // x를 읽기만 하도록 캡처해야 하는데, 수정하려고 함
올바른 코드:
auto lambda = [&]() { x++; }; // 참조로 캡처하여 수정 가능
실수 2: 반환 타입 지정 누락
auto lambda = []() { return 1 + 2; }; // 자동으로 int로 추론되지만, 복잡한 경우 명시적 지정 필요
올바른 코드:
auto lambda = []() -> int { return 1 + 2; }; // 명시적으로 int 반환 타입 지정
6. 정리
다음에 학습하면 좋은 주제는 std::function과 스마트 포인터입니다. 이 두 주제는 Lambda 함수와 함께 사용될 때 코드의 유연성을 더욱 높여줍니다.