본문 바로가기
프로그래밍 이야기/C++ 기초

함수 오브젝트와 람다 표현식

by Mulder5 2021. 9. 17.
반응형

Lambda Expression, 람다 표현식이란...

스코프 안에 있는 캡쳐 가능한 이름이 없는 Function Object를 만들어 주는 테크닉


다음과 같이 Muliplication 클래스가 있다. 멤버로서 localVar가 있고, 이는 생성자의 인자로서 초기화된다. localVar는 재정의된 연산자 ()에서 전달되는 인자 int x 와의 곱이 반환 된다. 

class Muliplication
{
public:
    explicit Muliplication(int a) : localVar{ a } {}
    int operator() (int x) const
    {
        return localVar * x;
    }
private:
    int localVar;
};

이 클래스, 즉 함수 오브젝트는 이렇게 사용될 수 있다. 

int main()
{
    // Function Object
    Multiplication multiplication3{ 3 };
    Multiplication multiplication5{ 5 };

    std::cout << multiplication3(10) << std::endl;
    std::cout << multiplication5(10) << std::endl;
   
    return 0;
}

함수 오브젝트 multiplication3{ 3 } 의 경우, { 3 }이 localVar가 되어 초기화 되며, multiplication3( 10 )에서 ( 10 ) 이 int x가 되어 3 * 10으로 연산된다. 

바로 이 함수 오브젝트를 다음의 람다 표현식으로 완전히 동일하게 구현할 수 있다. 

int main()
{
    // Function Object
    Multiplication multiplication3{ 3 };
    Multiplication multiplication5{ 5 };

    auto lamdaMultiplication3 = [localVar = 3](int x)
    {
        return localVar * x;
    };

    std::cout << multiplication3(10) << std::endl;
    std::cout << multiplication5(10) << std::endl;
    std::cout << lamdaMultiplication3(10) << std::endl;
    return 0;
}

캡쳐 절( [ ] )내에서 localVar는 3으로 초기회 되고, 인자 x와의 곱으로 연산되어 반환된다. 다음과 같이 lamdaMultiplication3은 함수 오브젝트 multiplication3과 동일한 값이 출력 된다.

 

반응형

'프로그래밍 이야기 > C++ 기초' 카테고리의 다른 글

Move Zeros  (0) 2021.10.18
이진 탐색 (Binary search)  (0) 2021.10.18
[Design Pattern] Container  (0) 2021.02.05
[Design Pattern] Observer (관찰자)  (0) 2021.02.04
[Design Pattern] PIMPL (Pointer to Implementation)  (0) 2021.02.03