본문 바로가기
C++ STL/Part 01 C++ 문법

3장 함수 객체

by 노오오오오옹 2021. 6. 22.

3. 함수 객체

3-1. 함수 객체란

함수처럼 동작하는 객체로, ()연산자를 정의해야 한다.

struct Func
{
    void operator()()
    {
        cout << "함수 객체" << end;
    }
};

int main()
{
    Func func;
    
    func(10, 20); // func.operator()(10, 20)
}

 

함수 객체의 장점 

  • 함수처럼 동작하는 객체이기 때문에 다른 멤버 변수와 함수를 가질 수 있다.
  • 함수 객체의 서명이 같더라도 타입이 다르면 서로 전혀 다른 타입으로 인식한다.
  • 일반함수보다 빠르다
  • 함수의 주소를 전달하여 콜백하는 경우에도 함수 객체는 인라인이 가능하다.
class Adder
{
    int total;
    
public
    Adder(int n=0) : total(n) {}
    
    // 클래스 내부에 정의되므로 암묵적으로 인라인 함수가 된다.
    int operator()(int n) // 서명이 같아도 다른 타입의 함수 객체는 댕비할 수 없다.
    {
        return total += n;
    }
};

int main()
{
    Adder adder;
    
    cout << adder(10) << endl;
    cout << adder(10) << endl;
    cout << adder(10) << endl;
    
    // 10
    // 20
    // 30
}
struct Func1
{
    void operator()(int n)
    {
        cout << n << " "; 
    }
};

struct Func2
{
    void operator()(int n)
    {
        cout << n*10 << " "; 
    }
};

struct Func3
{
    void operator()(int n)
    {
        cout << "정수 : " << n << endl;
    }
};

int main()
{
    int arr[5] = {1,2,3,4,5};
    
    // 기존에는 함수를 전달했지만, 이제는 함수 객체를 전달한다.
    for_each(arr, arr+5, Func1()); // 임시 함수 객체 Func1()을 만들어 전달
    for_each(arr, arr+5, Func2()); // 임시 함수 객체 Func2()을 만들어 전달
    for_each(arr, arr+5, Func3()); // 임시 함수 객체 Func3()을 만들어 전달    
}

※ 다만 사용자 정의 타입이기 때문에 미리 만들수는 없다. 그래서 템플릿을 사용한다.

 

3-2. 함수 객체의 구현

대표적인 함수 객체는 less와 greatter가 있다. 이 둘은 bool 형을 반환하는 조건자이다.

bool isLess(int a, int b)
{
    return a < b;
}

struct Less
{
    bool operator()(int a, int b)
    {
        return a < b;
    }
};

int main()
{
    Less ls;
    
    cout << isLess(10, 20) << endl;
    
    cout << ls(10, 20) << endl; // 객체로 암묵적 함수 호출
    cout << ls.operator()(10, 20); // 명시적 호출
    
    cout << Less()(10, 20) << endl; // 임시 객체로 암묵적 함수 호출
    cout << Less().operator()(10, 20) // 명시적 호출
}

 

※ STL의 less 함수 객체

#include <functional> // less<> 헤더

typedef less<int> Less;
struct Less
{
    bool operator()(int a, int b)
    {
        return a < b;
    }
};

struct Greater
{
    bool operator()(int a, int b)
    {
        return a > b;
    }
};

int main()
{
    // 사용자 구현 : Less, Greater
    cout << Less()(10, 20) << endl; 
    cout << Greater()(10, 20) << endl;
    
    // STL 사용 : less<int>, greater<int>
    // 템플릿 클래스기이므로 임시 객체 less<int>(), greater<>()를 생성함.
    cout << less<int>()(10, 20) << endl;
    cout << greater<int>()(10, 20) << endl;
    
    
}

'C++ STL > Part 01 C++ 문법' 카테고리의 다른 글

4장 템플릿  (0) 2021.06.22
2장 함수 포인터  (0) 2021.06.17
1장 연산자 오버로딩  (0) 2021.06.17

댓글