[STL] 함수 객체

함수 객체란?
함수처럼 동작하는 객체로, 함수를 호출할때 ( )를 붙이는데 이 또한 연산자입니다.
다시말해 ( ) 연산자를 오버로딩한 객체를 함수 객체라고 합니다.
다른 말로는 함수자(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