람다식(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();
});
'프로그래밍 > C++' 카테고리의 다른 글
C++ ] enum class 사용법 (0) | 2023.10.03 |
---|---|
C++ ] .ini 파일 포맷, 설정 파일 입출력 방법 (0) | 2023.09.27 |
C++ ] std::thread 스레드 사용법 (0) | 2023.09.25 |
C++ ] 가변인자 받아서 string 또는 CString으로 출력하기 (0) | 2023.09.24 |
C++ ] std::map 자료구조 사용법 (0) | 2023.09.23 |