[C++] 간단한 객체 함수를 구현할때 람다식의 사용

람다식(Lambda Expressions)

C++에서 람다식은 간단한 함수를 정의할때 사용되는데, 람다식을 사용하여 함수 객체를 생성하고, 간단한 로직을 인라인으로 작성할 수 있다.

주로 STL이나 다른 함수에서 함수를 인자로 넘길때 많이 사용된다.

//[capture](parameters) -> return_type { // function body }
[&](int a){ return a<x; }

표기를 람다식이라 부른다.

capture

[&]는 캡처 리스트로, 람다 함수가 외부 변수를 참조하다는 뜻이다.

[&x]는 x만 참조하겠다는 뜻이다.

[x]는 x 값을 복사해서 람다 내부로 전달하겠다는 뜻이다.

[] 무엇도 캡쳐하지 않겠다는 뜻. 외부 변수를 사용하지 않는다.

[=] 모든 지역명을 캡쳐하겠다는 뜻. 모든 외부 변수를 값으로 복사해서 사용.

[this] 현재 클래스의 멤버 변수와 멤버 함수를 캡쳐한다는 뜻. (현재 클래스의 복사본은 this*를 캡쳐한다!)

parameters, return function

()은 파라미터 즉 람다 함수의 매개변수를 명시한다. 이후 캡처 리스트와 매개 변수로 함수 내용을 실행시켜 리턴한다. 예시를 보자

...
void printNumber(){
    // 람다식을 활용해 정수 벡터를 출력하는 예시
    std::vector<int> nums = {1,2,3}; // 정수 벡터
    std::for_each(nums.begin(), numbers.end(), [](int num) {
        std::cout << "숫자: " << num << std::endl;
    });
}

이 예제에서는 캡처 리스트를 사용하지 않았다.

그럼 다음은 외부 변수를 캡처하는 예제를 보자.

...
void printNumber(){
    // 람다식을 활용해 정수 벡터를 출력하는 예시
    int multi = 2; // **외부변수
    std::vector<int> nums = {1,2,3}; // 정수 벡터
    std::for_each(nums.begin(), numbers.end(), [multi](int num) {
        std::cout << "곱 숫자" << num * multi << std::endl; // 외부 변수 활용
    });
}

위와 같이 외부 변수를 캡처하여 내부 변수로 사용하고 있다! 그리하여 캡처한 변수들을 캡처 리스트라고 하는것

참고

⌜비야네 스트롭스트룹⌟, "A Toor Of C++",에이콘