함수 객체란?
함수처럼 동작하는 객체로, 함수를 호출할때 ( )를 붙이는데 이 또한 연산자입니다.
다시말해 ( ) 연산자를 오버로딩한 객체를 함수 객체라고 합니다.
다른 말로는 함수자(Functor)라고 합니다.
함수 객체를 사용하는 이유
1. 다른 멤버 변수와 멤버 함수를 가질 수 있습니다.
2. 함수 객체의 서명이 같더라도 객체 타입이 다르면 서로 전혀 다른 타입으로 인식합니다.
3. 일반 함수보다 속도가 빠릅니다.
=> 함수의 주소를 전달하여 콜백하는 경우 이 함수 포인터는 인라인이 될 수 없습니다.
일반적인 함수는 스택에 호출 주소가 적재되고 호출시 스택의 주소를 통해 내용을 부르고 돌아오며 함수 호출의 오버헤드가 생기는데, 인라인을 하게되면 이를 줄일 수 있습니다.
※인라인(inline): 코드 라인 자체가 안으로 들어간다. 즉, 호출하는 코드 자체가 함수 내용의 코드가 된다는 것.
실행속도가 빨라지며 최적화에 도움이됨.
예제 코드
#include <iostream>
using namespace std;
void Print() {
cout << "전역 함수!" << endl;
}
void Print(int a, int b) {
cout << "전역 함수: " << a << ',' << b << endl;
}
struct Functor
{
void operator() () {
cout << "함수 객체!" << endl;
}
void operator()(int a, int b) {
cout << "함수 객체: " << a << ',' << b << endl;
}
};
int main() {
Functor functor;
Print(); //전역 함수 호출
functor(); //멤버 함수 호출 functor.operator()와 같음.
Print(10, 20);
functor(10, 20);
return 0;
}
struct에서 operator를 통해 ( ) 연산자를 오버로딩하였습니다.
Main함수에서 functor( ) 과 functor(10, 20)을 통해 ( ) 연산자를 오버로딩한 함수를 호출함으로써 함수 객체로 쓰입니다.
또한 클래스의 멤버 함수들은 인라인이 적용된 함수입니다.
문제 풀이
1. 다음 Equal 클래스의 객체가 cmp일 때 두 정수가 같으면 true, 아니면 false를 반환하는 Equal 클래스를 작성하세요.
2. 다음 Adder 클래스의 객체가 add일 때 두 정수의 합을 반환하는 Adder 클래스를 작성하세요.
if ( cmp(10, 20))
cout << "같다! << endl;
else
cout << "다르다! << endl;
int sum = add(10, 20);
cout << "sum = " << sum << endl;
코드
#include <iostream>
using namespace std;
class Equal {
public:
bool operator()(int a, int b) {
return a == b;
}
};
class Adder {
public:
int operator()(int a, int b) {
return a + b;
}
};
int main() {
Equal cmp;
if (cmp(10, 20)) {
cout << "같다" << endl;
}
else
cout << "다르다!" << endl;
Adder add;
int sum = add(10, 20);
cout << "sum= " << sum << endl;
return 0;
}
각 클래스를 정의하여 ( ) 연산자를 오버로딩하고 매개변수를 받아 반환시키기만 하면 끝.
Main 함수에선 Equal 객체를 cmp로 정의하고, Adder는 add로 정의하여 객체에 매개변수만 전달시켜 반환값만 받으면 된다.
결과
'C++ > STL' 카테고리의 다른 글
[STL] 4장 문제풀이 (0) | 2025.02.21 |
---|---|
[STL] 함수 템플릿 (0) | 2025.02.21 |
[STL] 함수 포인터 - 콜백 함수 (0) | 2025.02.15 |
[STL] 함수포인터 - 멤버 함수 호출 (0) | 2025.02.15 |
[STL]함수 포인터 - 정적 함수 호출 (0) | 2025.02.15 |