[C/C++] 함수 객체(Function Object, Functor)

할랑말랑·2026년 3월 27일

C/C++

목록 보기
41/45

함수 객체(Function Object, Functor)

일반 함수처럼 호출할 수 있는 객체, 단순히 코드를 실행하는 함수와 달리, 데이터를 내부에 저장할 수 있어 훨씬 유연하고 강력한 기능을 제공
함수 객체는 operator()를 오버로딩한 클래스의 인스턴스입니다. 이를 통해 객체를 함수처럼 호출

주요 특징

  • 객체임에도 불구하고 () 연산자를 사용하여 일반 함수처럼 호출
  • 함수 내부에 변수(멤버 변수)를 가질 수 있어, 호출 간의 데이터를 유지하거나 진행 상황을 저장
  • 컴파일러가 인라인 최적화

활용

1. 람다 표현식

컴파일러는 람다 표현식을 만나면 익명의 함수 객체 클래스(클로저 타입)를 자동으로 생성
캡처와 멤버 변수 : 람다의 캡처 리스트는 함수 객체의 멤버 변수로 변환

2. STL 알고리즘

표준 라이브러리 함수에서 정렬 기준이나 조건(Predicate)을 전달할 때 사용

1. 함수 객체 : 매개변수로 곱한 값을 계속 저장하는 함수객체

#include <iostream>

class Multiplier
{
private:
    int factor; // 곱셈의 기준이 되는 값을 저장하는 멤버 변수

public:
    // 생성자: 객체를 생성할 때 초기값을 받아 factor를 초기화합니다.
    Multiplier(int _val) : factor(_val) {}

    // () 연산자 오버로딩
    // 이 함수 덕분에 Multiplier 객체를 함수처럼 호출할 수 있게 됩니다.
    int operator()(int _val)
    {
        // 멤버 변수 factor에 인자로 받은 _val 값을 곱하여 갱신합니다.
        factor *= _val;
        // 갱신된 factor 값을 반환합니다.
        return factor;
    }
};

int main()
{
    // factor가 3으로 초기화된 Multiplier 객체 'times3'를 생성합니다.
    Multiplier times3(3);

    // () 연산자 오버로딩으로 함수처럼 사용
    // times3(10)은 times3.operator()(10)과 같습니다.
    // factor(초기값 3)에 10을 곱하고, 결과(30)를 출력합니다.
    // 이 호출 후 times3 객체의 factor 값은 30으로 변경됩니다.
    std::cout << times3(10) << std::endl; // 멤버변수를 통해 값을 저장 factor = 3 * 10;

    // 이어서 times3(5)를 호출합니다.
    // 현재 factor 값인 30에 5를 곱하고, 결과(150)를 출력합니다.
    // 이 호출 후 times3 객체의 factor 값은 150으로 변경됩니다.
    std::cout << times3(5) << std::endl; // 30 * 5 = 150;

    return 0;
}

2. STL 알고리즘 : 개수 조건(캡처 값보다 큰 매개변수)

#include <iostream>
#include <vector>
#include <algorithm>

int main()
{
    std::vector<int> numbers = { 5,76,24,243,2,5,14,4,6,8,8,7,6,3,11 };

    int v = 6;
    // 람다 표현식 : 이름 없는 함수를 그 자리에서 바로 만드는 기능
    // [v] : 람다 외부의 변수 v를 값으로 캡처(capture)해서 람다 내부에서 사용
    // 람다 함수는 int 타입의 인자 x를 하나 받는다
    // 인자 x가 캡처한 v보다 크면 true를, 아니면 false를 반환
    auto lamda = [v](int x) {return x > v; };

    auto count = std::count_if(numbers.begin(), numbers.end(), lamda);
    std::cout << "6보다 큰 요소의 개수 : " << count << std::endl;

    return 0;
}

0개의 댓글