일반 함수처럼 호출할 수 있는 객체, 단순히 코드를 실행하는 함수와 달리, 데이터를 내부에 저장할 수 있어 훨씬 유연하고 강력한 기능을 제공
함수 객체는 operator()를 오버로딩한 클래스의 인스턴스입니다. 이를 통해 객체를 함수처럼 호출
컴파일러는 람다 표현식을 만나면 익명의 함수 객체 클래스(클로저 타입)를 자동으로 생성
캡처와 멤버 변수 : 람다의 캡처 리스트는 함수 객체의 멤버 변수로 변환
표준 라이브러리 함수에서 정렬 기준이나 조건(Predicate)을 전달할 때 사용
#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;
}
#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;
}