프로그래머/CPP_강의정리

cpp 함수 객체

미역국마싯 2021. 10. 6. 19:08

함수 객체(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