CS/C++

뇌를 자극하는 C++ STL : 3장. 함수 객체

샤아이인 2022. 1. 18.

내돈내고 내가 공부한 것을 올리며, 중요한 단원은 저 자신도 곱씹어 볼 겸 가볍게 포스팅하겠습니다.

1) 3장. 함수 객체

함수 객체는 함수처럼 동작하는 객체이다. 이는 () 연산자를 오버로딩한 객체이어야 한다. 또한 함수 객체를 Funtor라고 부르기도 한다.

 

함수를 두고 왜 함수객체를 사용하는 것 일까?

함수 객체는 근본이 객체이다. 멤버 변수와 멤버 함수를 가질 수 있고, 함수 객체의 signature가 같더라도 객체 타입이 다르다면 다른 타입으로 인식한다. 또한 인라인 될 수 있기에 일반 함수보다 빠르다.

 

다음 코드를 통해 알아보자.

#include <iostream>

using namespace std;

class Adder {
	int m_total;
public:
	explicit Adder(int n = 0) : m_total(n) {}
	int operator() (int n) {
		return m_total += n;
	}
};

int main()
{
	Adder add(0);

	cout << add(5) << endl;
	cout << add(15) << endl;
	cout << add(25) << endl;

	return 0;
}
 

다음 결과를 확인해 보자.

값이 정상적으로 누적된 것을 확인할 수 있다. class 내부에 구현된 operator() 함수는 자동적으로 inline 처리가 된다.

또한 signature가 같더라도 타입이 다른 함수 객체는 다르게 인식된다.

 

STL에서는 유용한 함수 객체가 이미 내장돼 있다. 대표적으로 less와 greater가 있다.

이들은 bool값을 반환하는 predicate이다. 다음 예를 통해 확인해 보자.

#include <iostream>
#include <functional> // less<> 헤더
using namespace std;

typedef less<int> Less;

int main()
{
	Less less;

	cout << less(10, 20) << endl; // 객체로 암시적 호출
	cout << less.operator() (10, 20) << endl; // 명시적 호출
	cout << Less() (10, 20) << endl; // 임시 객체로 암시적 호출
	cout << Less().operator() (10, 20) << endl; // 임시 객체로 명시적 호출

	return 0;
}
 

결과로는 다음과 같다.

STL less는 템플릿 class 이므로 typedef를 사용하여 간략하게 이름을 사용하였다.

 

함수 객체를 직접 구현할 수도 있다. 다음 +, -의 함수 객체 구현을 확인해 보자.

#include <iostream>
#include <functional> // less<> 헤더
using namespace std;

struct Plus {
	int operator() (int a, int b) {
		return a + b;
	}
};

struct Minus {
	int operator() (int a, int b) {
		return a - b;
	}
};

int main()
{
	cout << Plus() (10, 20) << endl; // 사용사 생성
	cout << Minus() (10, 20) << endl; // 사용사 생성
	cout << plus<int>() (10, 20) << endl; // STL
	cout << minus<int>() (10, 20) << endl; // STL

	return 0;
}
 

결과는 다음과 같다.

사용자가 만든 함수와 STL의 함수 객체의 결과가 같은 것을 알 수 있다.

STL에서도 template를 이용해 타입을 지정한 후, () 연산자를 사용하는 것이다.


2) 나의 현황

하루하루 열심히!! 살고 싶지만... 방학이라 그런가 너무 늘어진다....

이글의 모든 사진과 내용의 출처는 공동환 님께 있습니다.

댓글