함수 객체
함수 객체(function object)
STL 알고리즘에 데이터를 전달하기 위해서는 다음과 같은 방법을 사용할 수 있습니다.
1. 함수 포인터
2. 함수 객체
3. 람다 표현식
많은 STL 알고리즘이 데이터를 처리하기 위해 매개변수로 함수 객체(function object)를 받아들입니다.
펑크터(functor)라고도 불리는 함수 객체는 호출 연산자(())와 함께 사용할 수 있는 객체를 의미합니다.
이러한 함수 객체는 우선 타입을 선언하고, 해당 클래스에서 호출 연산자(())를 오버로딩하여 구현하게 됩니다.
함수 객체의 장점
직접적인 함수 호출과 비교하여 함수 객체를 사용하면 다음과 같은 장점을 가집니다.
1. 함수 객체는 상태(state)를 포함할 수 있습니다.
2. 함수 객체는 타입이므로, 템플릿 인수로 사용할 수 있습니다.
미리 정의된 함수 객체
STL은 자주 사용할만한 연산에 대해 몇 가지 기본적인 함수 객체를 미리 정의하여 제공하고 있습니다.
이러한 미리 정의된 함수 객체는 함수를 매개변수로 전달받는 STL 함수를 지원하기 위해 제공됩니다.
이러한 함수 객체는 functional 헤더 파일에 정의되어 있습니다.
STL에서는 다음과 같은 함수 객체를 미리 정의하여 제공하고 있습니다.
함수 객체 | 연산자 | 함수 객체 | 연산자 |
---|---|---|---|
plus | + | greater | > |
minus | - | greater_equal | >= |
multiplies | * | less | < |
divides | / | less_equal | <= |
modulus | % | logical_and | && |
negate | - | logical_or | || |
equal_to | == | logical_not | ! |
not_equal_to | != |
다음 예제는 함수 객체를 사용하여 일반적인 산술 연산 및 관계 연산을 구현한 예제입니다.
예제
plus<int> add;
equal_to<int> comp;
greater_equal<int> ge;
cout << add(7, 3) << endl;
cout << comp(7, 3) << endl;
cout << ge(7, 3);
실행 결과
10
0
1
함수 객체는 일반적으로 위와 같이 사용하지는 않으며, 보통 함수의 인수로 전달될 때 사용됩니다.
다음 예제는 greater와 less 함수 객체를 각각 sort() 함수의 인수로 전달하여 사용하는 예제입니다.
예제
vector<int> vc = {20, 40, 10, 30}; // vector 객체의 선언 및 초기화
sort(vc.begin(), vc.end(), greater<int>());
copy(vc.begin(), vc.end(), ostream_iterator<int>(cout, " "));
cout << endl;
sort(vc.begin(), vc.end(), less<int>());
copy(vc.begin(), vc.end(), ostream_iterator<int>(cout, " "));
실행 결과
40 30 20 10
10 20 30 40