[C++] 11 콜백 함수(Callback function)

김진우·2025년 5월 22일

C++

목록 보기
11/16
post-thumbnail

정의

콜백 함수(Callback function)는 다른 함수에 파라미터로 전달되어 특정 시점에 호출되는 함수이다. 흔히 이벤트 처리, 비동기 작업 처리, 사용자 정의 동작 전달 등에 사용된다.

사용 방법

C++에서는 함수 포인터 또는 std::function을 사용하여 콜백을 구현할 수 있다. 객체지향 방식에서 멤버 함수를 람다나 std::bind로 넘기기도 한다.

0. 기본 선언

다음과 같은 콜백 함수가 미리 선언되어 있다고 가정한다.

#include <iostream>

void MyCallback(int result) {
    std::cout << "Callback called with result: " << result << std::endl;
}

1. 함수 포인터를 이용한 콜백

void DoSomething(int a, int b, void (*callback)(int)) {
    int result = a + b;
    // 작업이 끝난 후 콜백 호출
    callback(result);
}

int main() {
    DoSomething(3, 4, MyCallback);  // => 7 출력
    return 0;
}

2. std::function을 이용한 콜백

std::function을 사용하기 위해 <functional>헤더를 추가해야 한다.

#include <functional>

void DoSomething(int a, int b, std::function<void(int)> callback) {
    int result = a + b;
    callback(result);
}

int main() {
    auto myLambda = [](int r) {
        std::cout << "Lambda callback: " << r << std::endl;
    };

    DoSomething(5, 6, myLambda);  // => 11 출력
    return 0;
}

3. 클래스 멤버 함수 콜백 (bind 사용)

#include <functional>

class Worker {
public:
    void OnWorkDone(int result) {
        std::cout << "Member callback: " << result << std::endl;
    }
};

void DoSomething(int a, int b, std::function<void(int)> callback) {
    int result = a + b;
    callback(result);
}

int main() {
    Worker w;
    
    // std::bind 사용
    DoSomething(2, 3, std::bind(&Worker::OnWorkDone, &w, std::placeholders::_1));
    
    return 0;
}

4. 클래스 멤버 함수 콜백 (람다 사용)

#include <functional>

class Worker {
public:
    void OnWorkDone(int result) {
        std::cout << "Member callback: " << result << std::endl;
    }
};

void DoSomething(int a, int b, std::function<void(int)> callback) {
    int result = a + b;
    callback(result);
}

int main() {
    Worker w;
    
    // 람다 사용
    DoSomething(7, 8, [&](int r) { w.OnWorkDone(r); });
    
    return 0;
}

활용 예시

  • 이벤트 리스너 (버튼 클릭 등)
  • 비동기 작업 완료 시점 (파일 로드, 네트워크 응답)
  • Unreal Engine같은 프레임워크에서 사용자 행동 처리

콜백함수 구현 시 주의사항

  • 함수 포인터는 타입이 정확히 일치해야 한다.
  • 클래스 멤버 함수는 this 포인터가 필요하다. (그래서 std::bind나 람다로 감싸야 한다).
  • 객체의 수명이 끝난 후 콜백이 호출되지 않도록 주의해야 한다.

0개의 댓글