함수 객체(Functor)
함수처럼 동작하는 객체를 함수 객체라 한다. 이는 함수 포인터의 단점을 보완한다.
함수 포인터의 단점
1. 함수 포인터는 동일한 틀을 가진 함수만 받을 수 있다.
2. 상태를 가질 수 없다.
여기서 상태란 함수에 저장되는 데이터를 말한다.
class Functor
{
public:
// () 연산자 오버로딩
void operator()()
{
cout << "Functor Test" << endl;
cout << _value << endl; // 상태를 가지고 있다.
}
bool operator()(int num)
{
cout << "Functor Test" << endl;
_value += num; // 상태를 변화시킬 수 있다.
cout << _value << endl;
return true;
}
private:
int _value = 0;
};
함수 객체에서 알 수 있듯이 클래스를 정의해야 한다.
또한 함수를 실행할 때 Test()처럼 사용하는데 여기서 ()은 연산자다. 객체를 함수처럼 사용하기 위해서 이것을 오버로딩 해야 한다.
Functor 클래스에는 _value라는 멤버 변수가 있다. 이것이 상태다. 이러한 상태를 사용하거나 수정할 수 있다.
즉, 함수 객체를 만들기 위해서는 클래스를 정의해야 하고, 해당 클래스 안에는 () 연산자를 오버로딩한 멤버 함수가 존재한다. 그리고 멤버 함수에서 사용하는 멤버 변수를 선언한다.
Functor functor;
functor(); // 연산자 오버로딩
bool check = functor(3);
연산자 오버로딩을 통해서 일반적인 함수처럼 사용할 수 있다.
어디서 사용하나
MMO의 서버쪽에서 함수 객체를 유용하게 사용한다.
예를들면, 수 만개의 클라이언트가 서버에게 자신의 이동 요청을 보낸다고 하자. 서버는 이러한 작업을 한꺼번에 처리할 수 없다. 따라서 순차적으로 처리하는데 이때 사용하는 것이 함수 객체이다.
함수 객체를 사용하면 클라이언트의 요청을 functor로 만들어서 생성과 처리 시점을 분리할 수 있다. command pattern이라고도 한다.
즉, 수 만개의 요청을 함수 객체로 생성하고 처리할 때는 하나씩 처리하는 것이다.
출처
https://www.inflearn.com/course/%EC%96%B8%EB%A6%AC%EC%96%BC-3d-mmorpg-1/dashboard
[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문 - 인프런 | 강의
시리즈를 원활하게 학습하기 위한 기초적인 C++ 문법들에 대해 학습합니다. 어셈블리 언어부터 시작해서 기본 C++ 문법, STL, C++11까지 핵심적인 내용을 압축해서 다루게 됩니다., - 강의 소개 | 인
www.inflearn.com
'프로그래머 > CPP_강의정리' 카테고리의 다른 글
cpp STL vector편 (0) | 2021.11.20 |
---|---|
cpp 템플릿 기초 (0) | 2021.10.06 |
cpp 함수 포인터 (0) | 2021.10.06 |
cpp 디버깅 기초 (0) | 2021.09.28 |
cpp casting의 4가지 방법 (0) | 2021.09.27 |