개발자/개발

[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에서 자주 활용되며, 성능 최적화에도 유리하다.