Functor
개념
함수처럼 동작하는 객체
완전히 동일한 모양(시그니처)로 만들어진 함수만 포인터로 들고있을 수 있다라는 단점.
근데 이것을 함수 객체를 이용하면 어느정도 극복이 가능함.
이렇게 선언 사용, 동작을 넘겨줄 때 사용가능.
그런데
1) 시그니처 안 맞으면 사용불가.
2) 상태를 가질 수 없다.
=> '상태'라 함은 말 그대로 함수에 저장된 '값'을 말한다.
이런 클래스 있을 경우
_hp라는 것은 knight라는 녀석의 상태값이 되는 것이다.
덩그러니 AddHP만 사용하는 경우
딱히 어떤 상태도 지닐 수 없다.
단지 넘겨준 addHp라는 인작 있을 뿐이다.
Knight의 _hp를 가지면서 내부적으로 유지가 되는 그런 개념은 아니다.
그런데 함수를 실행하고 기존의 데이터를 유지시키면 좋은 경우도 생기는데
'함수 포인터' 만으로는 이런 기능을 하기에는 아쉽다.
그래서 '함수 객체'를 사용하면 이런 부분을 극복할 수 있다.
함수처럼 동작하는 객체
이렇게 클래스 하나 만들어주도록 하자.
함수는 HelloWorld(); 처럼 () 라는 소괄호가있다.
'()' 연산자 오버로딩이 필요하다.
이렇게 오버로딩 만들고.
객체를 만들고 함수인것 마냥 이렇게 실행이 가능함.
또한
이런식으로 여러가지 버젼을 만들 수 있다는 것이다.
ㅇㅇ.
Functor라는 개념이 어려운게 아니고
OOP 문법 사용해서 그냥 기존에것 사용한 것임.
STL -> 많이 사용.
MMO만들때 '함수 객체'많이 사용한다.
특히 서버에서.
이렇게 5, 0 좌표로 이동시켜 달라는 것을
들어온 순서대로 나열해서 처리를 해줄 것이다.
그럴때 Functor를 이용해서 어떤 객체를 이용해서
요청한 것을 객체로 만들어 주게 될 것이다.
이렇게 Functor의 객체를 만들어주게 되면
가장큰 장점이
Functor의 객체를 만들어 준 시점과 실제 실행한 시점을
분리할 수 있다는 것이다.
이런 느낌의 Functor있다고 하자.
그래서
이런 이동 통신이 욌다면은
그때이제 "요청이 왔다!" 라는 의미에서
MoveTask task; // 이렇게 객체를 만들어 줄 수 있다.
task._PlayerId = 1;
task._posX = 5;
task._posY = 0;
근데 지금 일감이 밀려서 당장 처리할 여유가 안된다면,
나중에 여유가 될때 일감을 처리를 할 수 있을 것이다.
// 여유가 생기면
task(); // 이렇게 실행하면된다.
이렇게 논리적으로 일감을 만들어주는 부분과
실행하는 부분이 나뉘는 것이다.
이것을 command pattern으로 개념으로 불린다.