Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C++ 펑터(Functor)란? 함수 객체의 개념과 활용법

펑터(Functor)는 C++에서 함수 객체(Function Object)를 의미합니다. 펑터를 사용하면 클래스의 인스턴스 객체를 마치 일반 함수처럼 호출할 수 있습니다. 즉, 하나의 인자를 받아 처리하는 함수처럼 동작하는 객체를 만들어, 데이터 집합에 대해 특정 작업을 수행하도록 활용할 수 있습니다.

펑터의 기본 원리

펑터의 핵심은 클래스 내부에서 operator() 연산자를 오버로딩하는 것입니다. 이렇게 하면 객체 이름 뒤에 괄호 ()를 붙여 함수 호출 문법 그대로 사용할 수 있습니다.

#include <iostream>
using namespace std;

class Square {
public:
    int operator()(int x) {
        return x * x; // x의 제곱 반환
    }
};

int main() {
    Square square;      // 펑터 객체 생성
    cout << square(5);  // 함수처럼 호출 → 출력: 25
    return 0;
}

STL 알고리즘과 함께 사용하기

펑터는 STL 알고리즘과 함께 사용할 때 특히 강력합니다. 아래 예제에서는 transform 알고리즘에 함수 객체를 전달하여 배열의 모든 요소를 제곱합니다.

예제 코드

#include <iostream>
#include <algorithm>
using namespace std;

int square(int x) {
    return x * x; // x의 제곱 반환
}

int main() {
    int data[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
    transform(data, data + 10, data, square);
    for (int i = 0; i < 10; i++)
        cout << data[i] << endl;
}

실행 결과

0
1
4
9
16
25
36
49
64
81

펑터를 사용하는 이유

일반 함수 포인터 대신 펑터를 사용하면 다음과 같은 장점이 있습니다.

  • 상태 유지: 멤버 변수를 통해 객체 내부에 상태를 저장하고 활용할 수 있습니다.
  • 인라인 최적화: 컴파일러가 operator() 호출을 인라인으로 처리하여 성능을 향상시킬 수 있습니다.
  • 타입 안정성: 템플릿과 결합하면 타입에 안전한 범용 코드를 작성할 수 있습니다.

이처럼 펑터는 C++에서 함수처럼 동작하는 유연한 객체를 구현할 수 있게 해주며, STL과 함께 사용하면 코드의 재사용성과 성능을 모두 높일 수 있는 강력한 도구입니다.