c++ Lambda

DevCho1107

·

2023. 5. 23. 00:29

C++ 람다(lambda)는 익명 함수를 생성하는 기능으로, 함수 객체를 간단하게 정의하고 사용할 수 있는 방법을 제공합니다. 람다는 주로 함수형 프로그래밍이나 콜백 함수 등에서 유용하게 사용됩니다. C++11부터 도입되었으며, 람다는 코드의 가독성과 편의성을 높여줍니다.

람다의 기본 구문은 다음과 같습니다:

[capture](parameters) -> return_type { 
    // 함수 내용 
}

capture: 람다 함수에서 외부 변수를 사용할 때 해당 변수를 캡처합니다. 캡처는 [] 안에 위치하며, 기본적으로 외부 변수에 접근할 수 없습니다. 필요한 변수를 캡처하려면 캡처 리스트에 변수를 명시해야 합니다. 예를 들어 x와 y를 캡처하려면 [x, y]와 같이 씁니다. 캡처에는 값 캡처([=]), 참조 캡처([&]), 믹스 캡처([=, &x] 또는 [&, x]와 같이) 등의 다양한 옵션도 있습니다.
parameters: 함수의 매개변수를 지정합니다.
return_type: 함수의 반환 타입을 지정합니다. 생략 가능하며, 생략 시 자동으로 반환 타입이 추론됩니다.
{}: 함수의 내용을 중괄호로 감싸줍니다.

 

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

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

    // 람다를 사용한 정렬
    std::sort(numbers.begin(), numbers.end(), [](int a, int b) {
        return a < b;
    });

    // 람다를 사용한 반복문
    std::for_each(numbers.begin(), numbers.end(), [](int num) {
        std::cout << num << " ";
    });

    return 0;
}

사용 시 주의할 점으로는, 캡쳐한 변수의 주솟값이 비동기 람다의 경우 바뀌어 있을 수 있고, 해제되어 있을 수 있다. 

게임 서버에서 예를 들자면,  DB쪽에 별도의 스레드를 통해 요청한 쿼리에 대한 콜백, 혹은 서버간의 메세지 콜백의 경우가 있을 수 있겠다. 

위의 경우 서버가 바로 crash 날수도 있고, 다른 주솟값 혹은 쓰레기값으로 인해 정말 더 큰 사고가 터질 수 있음에 유의하자.

'< Programming > > C++' 카테고리의 다른 글

std::next와 std::advance의 차이점  (0) 2023.06.08
c++ 11 std::function  (0) 2023.05.23
emplace_back  (0) 2023.05.08
constexpr ( generalized constant expressions )  (0) 2023.05.04
C++ 17 에서 업데이트 된 기능 정리.  (0) 2023.04.25