[STL] Call & Callback

치치·2025년 2월 12일

STL

목록 보기
6/21
post-thumbnail

Call

  • 일반적인 함수 호출을 의미한다
    -> 계속 사용했던 함수를 정의해두고 main함수에서 그것을 호출하는 방법


Callback

  • 다른 함수에 인자로 전달되어 실행되는 함수를 의미한다
    -> 다른 함수에 의해 나중에 호출 될 수 있는 함수
    -> 동적 실행이 가능하다

콜백 함수를 사용하는 이유

  • 여러 종류의 함수를 매개변수로 전달받기 위해서다
  1. 아래의 코드에서 2개의 전역함수가 있다
    -> int add(int a, int b)
    -> int subtract(int a, int b)

  2. Calculate 함수안의 매개변수로 함수를 받아온다
    -> 인자값에 들어있는 int (*operation)(int,int)함수 포인터이다
    -> 매개변수로 들어온 함수의 주소값을 저장하는 역할을 한다

  1. Calculate함수 안에서 함수 포인터가 가리키고 있는 함수를 호출한다

즉, 매개변수로 여러 함수가 들어와서 처리를 할 수 있다
-> 같은 함수를 호출하지만, 다른 동작을 할 수 있다는 것
-> 똑같이 Calculate 함수를 호출했지만, 인자로 넘겨주는 함수가 다르기 때문에, 함수 안에서 다른 전역함수들이 호출된다

#include <iostream>
using namespace std;

// 두 수를 더하는 함수
int add(int a, int b) 
{
    return a + b;
}

// 두 수를 빼는 함수
int subtract(int a, int b) 
{
    return a - b;
}

// 두 수를 처리하는 함수. 함수 포인터를 매개변수로 받음
void calculate(int a, int b, int (*operation)(int, int)) 
{
   cout << "Result : " << operation(a, b);
}

int main() 
{
    int x = 10, y = 5;

    // add 함수 전달
    calculate(x, y, add);

    // subtract 함수 전달
    calculate(x, y, subtract);

    return 0;
}


또 다른 예시

  1. 아래의 Calculate 함수의 인자에 함수 포인터가 있다
    void (*callback)(int)
    -> 앞에서 다뤄보았다. void반환형을 가지고 매개변수는 정수형 1개인 함수를 가리킬 수 있는 포인터

  2. *callback 포인터는 PrintResult 함수의 주소값을 저장하고 있다
    -> callback 포인터를 통해서 해당 함수를 호출할 수 있다

#include <iostream>
using namespace std;

void PrintResult(int result)
{
	cout << "Result : " << result << endl;
}

// 인자에 전역 함수 포인터 
void Calculate(int a, int b, void (*callback)(int))
{
	int result = a + b;
	callback(result);
}

int main()
{
	Calculate(5, 3, PrintResult);

	return 0;
}


Callback 함수 장단점

  1. 동적으로 다른 함수를 전달받고 호출할 수 있기 때문에 매우 유연하다
    -> 여러 종류의 작업을 처리할 때, 어떤 함수를 실행할지 선택할 수 있다
    -> 유니티에서 버튼 클릭 시 호출할 함수를 콜백으로 전달할 수 있다

  2. 콜백함수를 너무 난잡하게 사용 시, 코드의 의존성이 높아지고 가독성이 떨어지게 된다


서버 <-> 클라이언트

Call : 클라이언트가 서버를 호출하는 경우
CallBack : 서버가 클라이언트를 호출하는 경우

profile
뉴비 개발자

0개의 댓글