개발자/개발
[C++] 함수 객체 Functor
naheesu
2025. 3. 21. 09:49
1. 함수 객체(Functor)란?
- 함수처럼 동작하는 객체를 의미하며, operator() 연산자를 오버로딩하여 사용한다.
- 일반적인 함수보다 상태를 저장할 수 있다는 점에서 차이가 있다.
- STL 알고리즘에서 함수 포인터 대신 자주 사용된다.
🛠 함수 객체의 구현
✅ 기본적인 Functor
#include <iostream>
class Functor {
public:
void operator()() { // () 연산자 오버로딩
std::cout << "함수 객체가 호출되었습니다!" << std::endl;
}
};
int main() {
Functor functor; // 객체 생성
functor(); // 함수처럼 호출 가능
return 0;
}
📌 결과:
함수 객체가 호출되었습니다!
🛠 함수 객체의 활용
✅ 매개변수가 있는 Functor
#include <iostream>
class Adder {
private:
int value;
public:
Adder(int val) : value(val) {} // 생성자에서 값 초기화
int operator()(int x) { // () 연산자 오버로딩
return value + x;
}
};
int main() {
Adder add5(5); // 5를 더하는 함수 객체
std::cout << add5(10) << std::endl; // 10 + 5 = 15 출력
return 0;
}
✔️ Adder(5)처럼 객체를 생성하면 내부 상태(value)를 유지하면서 operator()를 호출할 수 있음.
🛠 STL과 Functor
STL의 std::sort() 함수에서 비교 연산을 함수 객체로 활용할 수 있다.
✅ STL에서 Functor 활용 예제
#include <iostream>
#include <vector>
#include <algorithm>
class Compare {
public:
bool operator()(int a, int b) { // 내림차순 정렬
return a > b;
}
};
int main() {
std::vector<int> vec = {3, 1, 4, 1, 5, 9, 2};
std::sort(vec.begin(), vec.end(), Compare()); // 비교 함수 객체 전달
for (int num : vec) {
std::cout << num << " ";
} // 9 5 4 3 2 1 1
return 0;
}
🛠 람다 함수와의 비교
C++11 이후부터는 함수 객체 대신 람다 함수를 더 많이 사용한다.
✅ 람다 함수로 대체
std::sort(vec.begin(), vec.end(), [](int a, int b) { return a > b; });
✔️ 람다가 더 간결하지만, Functor는 상태를 유지할 수 있는 장점이 있음.
✔️ Functor는 상태를 가질 수 있어 STL에서 자주 활용되며, 성능 최적화에도 유리하다.