이번 시간에는 함수 객체에 대해 알아보자
함수 객체 (Functor): 함수처럼 동작하는 객체
여기서 잠깐,
사실상 자주 쓰지도 않는 함수 포인터를 굳이 공부하고 함수 객체를 배워야 하는 이유가 무엇일까?
바로 함수 포인터의 단점을 보완한 것이 함수 객체이기 때문이다
그럼 함수 포인터의 장단점을 알아보자
함수 포인터의 장점은 무엇일까?
바로 동작을 넘겨줄 때 유용하다는 것이다
아래처럼 말이다
void Hello1(){}
int main()
{
void (*pfunc)();
pfunc = &Hello1;
(*pfunc)();
}
그러면 함수 포인터의 단점은 무엇일까?
1) 시그니처가 안 맞으면 사용할 수 없다
void Hello1()
{
}
void Hello2(int number)
{
}
int main()
{
void (*pfunc)();
// pfunc = &Hello2; // 불가능하다
}
2) 상태를 가질 수 없다
함수의 주소를 담는 포인터 바구니이기에
결국, 멤버함수의 동작을 실행시켜 줄 뿐 상태를 가지지 못한다
이러한 단점을 극복하기 위해 등장한 것이 바로 함수 객체이다
함수 객체는 어떻게 만드는지 아래를 통해 알아보자
// 함수객체: "함수처럼 동작"
// 함수처럼 동작하기위해 () 연산자 오버로딩이 필요
class Functor
{
public:
void operator()() // 인자를 받지않는 버전
{
}
bool operator()(int num) // 인자를 받는 버전
{
_value += num;
}
public:
int _value = 0;
};
int main()
{
Functor functor; // 상태 값을 들고 있으면서
functor(); // 함수처럼 호출도 가능 (인자를 받지않는 버전)
bool temp = functor(3); // (인자를 받는 버전)
}
함수 객체의 개념은
STL을 공부하면서 자주 사용할 예정이니 반드시 기억하도록 하자
그럼 끝내기 전에
MMO에서 함수 객체를 사용하는 예시를 잠깐 알아보자
클라와 서버가 실시간으로 계속 소통을 하는 상황이라면
서버는 클라가 보내준 네트워크 패킷을 받아서 처리를 하게 된다
하지만, 네트워크 패킷이 너무 많으면 중요한 우선순위에 따라 하나씩 실행해야 할 것이다
그럴 때, 아래와 같이 활용할 수 있다
class MoveTask
{
public:
void operator()()
{
// 동작
}
public:
int _playerId;
int _posX;
int _posY;
};
int main()
{
MoveTask task;
task._playerId = 100;
task._posX = 5;
task._posY = 0;
// 위처럼 함수 객체를 이용해 해야할 일을 만들어 놓고
task();
// 나중에 순서가 되면 혹은 여유가 될 때 일을 실행
}
위처럼 일감을 미리 만들어 놓고
필요할 때 그 동작을 수행하도록 만들 수 있다
이렇게 사용하는 방식을 커맨드 패턴이라고 부른다
'C++ > [루키스] 콜백함수' 카테고리의 다른 글
[STL 사전지식] 6. 콜백 함수 (0) | 2023.01.25 |
---|---|
[STL 사전지식] 5. 템플릿 기초 (2) (0) | 2023.01.25 |
[STL 사전지식] 4. 템플릿 기초 (1) (0) | 2023.01.25 |
[STL 사전지식] 2. 함수 포인터 (2) (0) | 2023.01.22 |
[STL 사전지식] 1. 함수 포인터 (1) (0) | 2023.01.22 |