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

C++ ] 람다식 사용법 및 람다식으로 콜백 구현

by eteo 2023. 9. 26.

 

 

람다식(lambda expression)을 사용하면 코드 내에서 명시적인 함수 정의 없이도 익명함수를 생성하고 사용할 수 있게 해준다. 이런 함수는 주로 한번만 사용하거나 특정 상황에서만 필요한 경우 유용하다.

 

 

 

 

람다식의 기본 구조

 

[캡처](매개변수) -> 반환형 {
    // 람다 함수 본문
    // ...
}
[캡처] {
    // 람다 함수 본문
    // ...
}

 

 

1. [캡처] : 외부 변수를 사용하기 위해 외부 범위의 변수를 캡처할 수 있다. [ ] 안에 캡처할 변수를 지정한다.

  • [] : 아무것도 캡처하지 않음
  • [변수] : 특정 변수를 값 복사로 캡처
  • [&변수] : 특정 변수를 레퍼런스로 캡처
  • [=] : 모든 외부 변수를 값 복사로 캡처
  • [&] : 모든 외부 변수를 레퍼런스로 캡처

2. (매개변수) : 람다 함수의 매개변수 목록을 정의한다. 필요에 따라 매개변수를 생략할 수 있다.

3. -> 반환형: 반환형을 지정한다. 반환형을 생략하면 자동으로 추론된다. 

4. { 본문 } : 람다 함수의 본문을 작성한다. 이 부분에 원하는 동작을 구현하면 된다.

 

 

 

 

 

 

 

람다식 간단 예제

 

아래에선 반환형 '-> int'가 생략됐는데 a + b 연산을 통해 반환형이 int임을 자동 추론하게 되고 변수의 형식을 추론하는 auto 키워드의 add 변수는 해당 람다 함수를 가리키는 함수 포인터가 된다.

 

#include <iostream>

int main() {

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

    int result = add(5, 3);
    std::cout << "5 + 3 = " << result << std::endl;

    return 0;
}

 

 

 

 

 

 

 

람다식으로 콜백 구현

 

#include <iostream>
#include <functional>

class Button {
public:
    // 콜백 함수 타입 정의
    using ClickCallback = std::function<void()>;

    // 콜백 함수 등록 메서드
    void setClickCallback(ClickCallback callback) {
        clickCallback = callback;
    }

    // 버튼 클릭 시 동작 메서드
    void click() {
        if (clickCallback) {	// nullptr이 아닌경우
            clickCallback();
        }
    }

private:
    ClickCallback clickCallback;
};

class Application {
public:
    void run() {
        Button button;
        // 람다식
        button.setClickCallback([this]() {
            this->onButtonClick();
        });

        // 버튼 클릭 시뮬레이션
        button.click();
    }

    void onButtonClick() {
        std::cout << "버튼이 클릭되었습니다." << std::endl;
    }
};

int main() {
    Application app;
    app.run();

    return 0;
}

 

 

 

위 예제에서 람다식으로 콜백함수를 등록하는 부분은 아래 부분이다. 이렇게 하면 Button 클래스가 Application 클래스를 몰라도 Button 클래스의 이벤트를 처리하기 위한 콜백을 외부에서 등록할 수 있으며 Button 클래스는 더 일반적이고 재사용 가능한 형태로 유지될 수 있다.

 

button.setClickCallback([this]() {
    this->onButtonClick();
});