C++을 사용하다 보면 함수 자체를 다른 함수의 파라미터로 넘기는 경우가 있습니다. 다음의 예를 살펴보도록 하겠습니다.
template <class RandomIt> void sort(RandsomIt first, RandomIt last, Compare comp); | cs |
template을 이용하여 정렬할 값의 시작과 끝을 알려줍니다. 비교할 함수를 받아 comp() 함수를 이용해 값을 비교합니다. 이 때 비교 함수는 우리가 정렬하는 값이 문자열인지, 숫자인지, 객체인지에 따라 임의로 전달해 주어야 합니다. 즉 함수를 파라미터로 넘겨주어야 하는 것입니다. 이런 상황이 다른 곳에서 많이 발생합니다. 따라서 비교하는 함수를 만들어 정렬할 때마다 전달해야 합니다.
하지만 이러한 함수는 굉장히 짧고 다른 곳에서 쓰이지 않을 일회용 함수일 가능성이 높습니다. 이런 일회용 함수를 선언하고 정의할 필요가 없어야 합니다. C++11에서 이름 없는 함수인 lambda를 새로 적용할 수 있도록 한 것입니다.
[] () {} // []는 함수 선언, ()는 파라미터 전달, {}는 함수 몸체 구현 | cs |
Labmda는 위와 같이 3가지의 괄호를 이용합니다. 처음 []를 이용하여 함수가 선언됩니다. ()는 파마리터를 전달합니다. {}는 몸체를 구현합니다.
#include <iostream> #include <algorithm> // sort함수 #include <vector> using namespace std; class Multiplier { int first; int second; public: Multiplier(int f, int s) { first = f; second = s; } int getResult() { return first * second; } }; int main() { vector<Multiplier> multipleData; for (int i = 0; i < 10; i++) { Multiplier multiple = Multiplier(rand() % 10, rand() % 10); multipleData.push_back(multiple); } cout << "정렬되지 않은 결과" << endl; for (vector<Multiplier>::iterator iter = multipleData.begin(); iter != multipleData.end(); iter++) { cout << iter->gtResult() << endl; } sort(multipleData.begin(), multipleData.end(), [](Multiplier& m1, Multiplier& m2) { // lambda를 이용한 비교함수 선언 return m1.getResult() < m2.getResult(); }); cout << "정렬된 결과" << endl; for (vector<Multiplier>::iterator iter = multipleData.begin(); iter != multipleData.end(); iter++) { cout << iter->getResult() << endl; } return 0; } | cs |
실행 결과를 보면 정렬되지 않은 값이 정렬된 상태로 출력되는 것을 알 수 있습니다. Multiplier 클래스는 두 수를 곱하는 결과를 전달하는 클래스입니다. getResult()의 결과는 두 수를 곱해서 전달합니다. Sort() 함수는 정렬을 수행합니다. Lambda를 이용해 비교 하는 함수를 직접 작성한 것을 확인 할 수 있습니다. 만약 lamda가 없다면 다른 곳에 따로 작성해야 합니다. 그러한 작업을 방지하기 위해 이름이 존재하지 않는 함수로 사용하는 것입니다.
'SW > C++' 카테고리의 다른 글
[ C++ ] tuple 개념 및 예제 (1) | 2018.11.16 |
---|---|
[ C++ ] 스마트 포인터 개념 및 예제 (0) | 2018.11.16 |
[ C++ ] range base for 개념 및 예제 (0) | 2018.11.16 |
[ c++ ] auto 개념 및 예제 (0) | 2018.11.15 |
C++11은 무엇일까요? (0) | 2018.11.15 |