펑터(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과 함께 사용하면 코드의 재사용성과 성능을 모두 높일 수 있는 강력한 도구입니다.