Notice
Recent Posts
Recent Comments
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| 8 | 9 | 10 | 11 | 12 | 13 | 14 |
| 15 | 16 | 17 | 18 | 19 | 20 | 21 |
| 22 | 23 | 24 | 25 | 26 | 27 | 28 |
Tags
- stl
- BFS
- 알고리즘
- 람다
- UE_LOG
- unorder_map
- enumasByue
- 약참조
- UML관련
- 스마트포인터
- 애셋로드
- C++최적화
- 정렬알고리즘
- 강참조
- 정렬
- 선택정렬
- map
- moreeffectiveC++
- 데이터애셋
- C++
- 자료구조
- makeweakobjectptr
- dataasset
- 구조적 바인딩
- 언리얼가비지컬렉터
- 비동기호출방법
- 프로그래머스
- 크리티컬섹션
- 델리게이트
- tweakobjectptr
Archives
- Today
- Total
기억을 위한 기록들
[CPP] 함수 객체(Functor)에 관하여 본문
함수 객체란 함수처첨 동작하는 객체를 뜻하며, 클래스의 객체가 () 연산자를 오버로딩해서 함수 호출처럼 쓸 수 있게 만든 것이다.
객체로 존재하므로 멤버변수를 넣어, 상태값을 가질수도 있다는 장점이 있다.
stl 사용 예시
#include <iostream>
#include <vector>
#include <algorithm>
struct Multiply {
int factor; // 곱할 값
// 생성자로 상태 저장
Multiply(int f)
: factor(f)
{}
// 함수 호출 연산자 오버로딩
int operator()(int x) const
{
return x * factor;
}
};
int main() {
std::vector<int> nums = {1, 2, 3, 4};
Multiply mul2(2); // 2배 곱하는 Functor
std::transform(nums.begin(), nums.end(), nums.begin(), mul2);
for (int n : nums)
{
std::cout << n << " "; // 출력: 2 4 6 8
}
}
정리하자면 함수객체(Functor)는 상태를 가진 함수라고 생각하면 될 것 같다.
물론 함수라고 해서 정보를 보관할수 없는 건 아니지만, 한계가 있고 관리라는 측면으로 봤을 때, 함수보다 나은 점이 있다는 것이다.
언리얼엔진에서의 함수 객체 사용 예시
언리얼엔진의 TArray 타입의 Sort 함수에서도 파라미터로 전달 받는 값이 함수 객체 형태로 되어 있다.
보통 람다함수를 넣어 바로 사용하지만,
TArray<FItem*> Items;
// Functor(람다)로 정렬 조건 전달
Items.Sort([](const FItem& A, const FItem& B) {
return A.Grade > B.Grade;
});
Sort함수 내부모습를 살펴보면

전달받은 Predicate라는 변수를 TDereferenceWrapper라는 타입으로 한번 감싸주는데 해당 변수 타입을 살펴보면,

내부에서 operator() 연산자를 사용해서 적용하는 모습을 볼 수 있다.
그리하여 아래와 같이 사용도 가능하다.
// 비교 펑터(Functor) 구조체
struct FSortByAbs
{
FORCEINLINE bool operator()(const int32& A, const int32& B) const
{
return A < B;
}
};
//..
void Example()
{
TArray<int32> Numbers = { -10, 3, -7, 2, -5 };
// 펑터 기반 정렬 (절댓값 기준 오름차순)
Numbers.Sort(FSortByAbs());
for (const int32 Num : Numbers)
{
UE_LOG(LogTemp, Log, TEXT("%d"), Num);
}
}
그런데 사실 해당 비교 연산자로 엄청나게 많은 내용을 넣지 않기에 대부분 람다를 사용해서 쓰지만 혹시 재사용할 일이 많거나, 많은 내용을 비교해야 한다면 함수객체를 따로 선언해서 불러오는 것도 좋은 방법 같다.
'C & CPP' 카테고리의 다른 글
| [C++] 정수 enum과 비트플래그 enum에 관하여 (0) | 2025.11.04 |
|---|---|
| [CPP] optional 에 관하여 (4) | 2025.09.01 |
| [CPP] 함수 포인터와 람다의 관하여 (1) | 2025.08.11 |
| [CPP] 가변인자(va_start 등) 매크로에 대해 (0) | 2025.07.20 |
| [C++17] 구조적 바인딩(structured bindings)에 대하여 (0) | 2025.04.06 |