IMCAT.DEV
로그인 가입
C++ 중급 함수형

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 함수입니다!

코드 한 줄씩 동작 설명:

  1. #include <iostream>: C++의 표준 입출력 라이브러리를 포함합니다.
  2. int main() {: 프로그램의 시작점인 메인 함수를 정의합니다.
  3. auto greet = []() { ... };: 이름이 없는 Lambda 함수를 정의하고 greet라는 변수에 할당합니다.
  4. std::cout << "안녕하세요, Lambda 함수입니다!" << std::endl;: Lambda 함수 내부에서 메시지를 출력합니다.
  5. greet();: 정의한 Lambda 함수를 호출합니다.
  6. return 0;: 프로그램을 정상적으로 종료합니다.
  7. 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. 정리

    • Lambda 함수는 이름이 없는 즉시 사용할 수 있는 함수로, 코드의 간결성을 높여준다.
    • 캡처를 통해 외부 변수를 사용할 수 있으며, 이를 통해 유연한 코드 작성이 가능하다.
    • 실무에서는 데이터 처리나 정렬, 이벤트 핸들링 등에 자주 사용된다.
    • Lambda 함수는 C++11부터 도입되었으며, 다양한 문맥에서 활용 가능하므로 반드시 익혀야 한다.

다음에 학습하면 좋은 주제는 std::function과 스마트 포인터입니다. 이 두 주제는 Lambda 함수와 함께 사용될 때 코드의 유연성을 더욱 높여줍니다.