B. 함수 객체
1. 함수 객체의 기본
a. 함수 객체란?
🌟 함수처럼 작동하는 객체
- 함수처럼 호출될 수 있고, 상태를 유지할 수 있음
- 주로 함수 포인터의 한계를 극복하거나 유연한 동작을 제공하기 위해 사용
- c++에서 자주 사용
b. 함수 객체의 구조
구조는 일반 클래스나 스트럭트의 구조와 다를게 없음
⏳ 함수 객체의 간단한 예제
#include <iostream>
// 함수 객체 클래스 정의
class MyFunctionObject {
public:
// 호출 연산자 정의
void operator()(int x) const {
std::cout << "함수 객체가 호출되었습니다. 인자: " << x << std::endl;
}
};
int main() {
// 함수 객체 생성
MyFunctionObject func;
// 함수 객체 호출
func(42);
return 0;
}
즉, 아래 클래스와 비슷하게
클래스의 멤버 함수를 호출하는 것이랑 다를게 없음
👉 즉, operator()의 호출 연산자로 오버로딩해 새롭게 만들어주는 것
c. 함수 객체의 주요 이점
1) 상태 유지
클래스의 멤버 변수를 통해 상태를 유지
함수 포인터로는 구현하기 어려운 상태를 가진 함수를 쉽게 표현할 수 있게 함
2) 다형성
클래스의 다형성을 활용할 수 있음상속과 가상함수를 통해 다양한 동작을 제공
3) 캡슐화
관련된 동작과 상태를 하나의 단위로 묶을 수 있음이는 코드의 가독성과 유지보수성을 향상시킴
4) 유연한 동작
함수 객체는 포인터와 달리 연산자를 통해 다양한 동작을 제공할 수 있음
d. 템플릿과 함수객체
템플릿과 함수 객체는 궁합이 잘 맞는다!
예를 들어서
현재 FuncType은 int로 지정되어 있는 함수 포인터이지만,
템플릿을 사용해서 바꿔주면 이렇게 간편하게 사용할 수 있다
👉 즉, 펑터를 만들어주고
그 펑터를 사용할 때 사용되는 함수는
템플릿 문법과 굉장히 잘 맞는다
e. less / greater
결국 우리가 함수 포인터와 객체를 공부한 이유는
less, greater를 이해하기 위해서 였음
💙 총정리
* 함수 포인터는 동작만 있는 것
* 함수 객체는 동작 + 데이터를 바인딩해 관리하는 것
두개를 적절히 유동적으로 사용하면 됨!
2. MMO 예제
a. 실행 예제
1) 클라 ➡ 서버 : 좌표로 이동해줘
2) 움직임 함수 객체 생성
👉 위와같이 함수 객체는 데이터와 행동을 저장
3) 움직임 실행
행위마다 클래스를 만드는게 부담스러우면 람다식을 이용
💙 다형성
최상위 클래스를 만들고 상속하면 다양한 행위들을 컨트롤 할 수 있음
'자료구조와 알고리즘 > Data Structure' 카테고리의 다른 글
[게임 프로그래머 입문 올인원] STL Container : list와 iterator(67강) (0) | 2024.02.21 |
---|---|
[게임 프로그래머 입문 올인원] STL Container : vector와 iterator (65, 66강) (0) | 2024.02.21 |
[게임 프로그래머 입문 올인원] 함수 포인터 (63강) (1) | 2024.02.19 |
[게임 프로그래머 입문 올인원] Maze Project : 그래프의 BFS기반 길찾기 (60강) (0) | 2024.02.19 |
그래프는 Vertex 구조체만 쓰기엔 아쉽다 (0) | 2024.02.18 |