728x90
반응형

C++ 람다(lambda) 표현식 이해와 활용 예제

C++11부터 도입된 람다 표현식은 익명 함수(anonymous function)를 정의하는 데 사용되며, 코드의 간결성과 가독성을 높여줍니다. 특히, 함수 객체나 함수 포인터를 대체하여 콜백 함수나 일회성 함수 정의에 유용하게 활용됩니다.

람다 표현식의 기본 문법은 다음과 같습니다:

cpp

[capture](parameters) -> return_type {
    // 함수 본문
}
  • capture: 람다 함수가 외부 범위에서 변수를 캡처하는 방법을 지정합니다.
  • parameters: 함수의 매개변수를 정의합니다.
  • return_type: 함수의 반환 타입을 명시합니다. (생략 가능)
  • {}: 함수의 본문을 정의합니다.

예를 들어, 두 정수의 합을 계산하는 람다 표현식은 다음과 같이 작성할 수 있습니다:

cpp

auto add = [](int a, int b) -> int {
    return a + b;
};

이제 add를 호출하여 두 수의 합을 구할 수 있습니다:

cpp

int result = add(3, 4); // result는 7이 됩니다.

람다 표현식은 특히 표준 라이브러리의 알고리즘과 함께 사용될 때 강력한 도구가 됩니다. 예를 들어, std::for_each와 함께 사용하여 벡터의 모든 요소를 출력할 수 있습니다:

cpp

#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 << " ";
    });
    // 출력: 1 2 3 4 5

    return 0;
}

람다 표현식은 외부 범위의 변수를 캡처하여 사용할 수 있습니다. 캡처 방식에는 값에 의한 캡처와 참조에 의한 캡처가 있습니다:

  • 값에 의한 캡처: [=] 또는 [변수명]을 사용하여 외부 변수를 복사합니다.
  • 참조에 의한 캡처: [&] 또는 [&변수명]을 사용하여 외부 변수에 대한 참조를 가져옵니다.

예를 들어, 외부 변수 factor를 참조하여 벡터의 모든 요소를 해당 값으로 곱하는 람다 표현식은 다음과 같습니다:

cpp

#include <iostream>
#include <vector>
#include <algorithm>

int main() {
    std::vector<int> numbers = {1, 2, 3, 4, 5};
    int factor = 2;

    std::for_each(numbers.begin(), numbers.end(), [&factor](int& n) {
        n *= factor;
    });

    for (int n : numbers) {
        std::cout << n << " ";
    }
    // 출력: 2 4 6 8 10

    return 0;
}

이처럼 람다 표현식을 활용하면 코드의 가독성과 유지보수성을 높일 수 있으며, 특히 콜백 함수나 일회성 함수 정의에 매우 유용합니다.

cpp

#include <cstdio>
#include <iostream>

int main(int agrc, char* argv[])
{
        // closure object using lambda function

        [](){ printf("hello, lambda. %d\n", __LINE__); }() ;
        []{ printf("hello, lambda. %d\n", __LINE__); }() ;

        int i = 5;
        [](int &v){ v += 10; }(i);
        std::cout << i << std::endl;

        return 0;
}
728x90
반응형

+ Recent posts