[Basic C++] #44_람다 표현식, 기본
STL 알고리즘 중 "람다 표현식"에 대해 알아보겠습니다.
"전문가를 위한 C"의 17 항목, "STL 알고리즘 마스터하기"에 해당하는 내용입니다.
Overview
- 개념
- syntax
- 캡처 블록
- mutable
#0. 개념
1. 람다 표현식?
- C++에서 제공하는 람다 표현식은 익명 함수를 인라인으로 정의합니다.
#1. syntax, 문법
1. 기본 문법
[capture list] (parameter list) -> return type { function body }
- capture 블록 활용은 선택적입니다.
- 캡처 블록은 유효 범위 내 주변 변수들을 캡처하기 위해 사용합니다.
- 컴파일러가 자동으로 "->"와 "return type"를 연역합니다. 따라서, 생략해도 문제가 없습니다.
- 하지만, 가독성과 추후에 발생할 수 있는 버그를 미연에 방지하기 위해 작성하는 것을 권유합니다.
2. 예제 코드1
#include <iostream>
using namespace std;
int main()
{
auto Sum = [](int a, int b) -> int { return a+b; };
}
3. 예제 코드 2 ( ->와 반환 타입 생략 )
#include <iostream>
using namespace std;
int main()
{
// 리턴 타입 X
auto basic1 = [](int a, int b) {return a + b; };
cout << basic1(3, 5) << '\n';
// 리턴 타입 O
auto basic2 = [](int a, int b) -> int {return a + b; };
cout << basic2(3, 5) << endl;
}
#2. 캡처 블록
1. 개념
- C++ 이 제공하는 람다 표현식의 캡처 블록은 동일한 유효범위 내 주변 변수들을 캡처하기 위해 사용합니다.
2. [=], 값에 의한 캡처 예제
#include <iostream>
using namespace std;
int main()
{
int a = 5;
int b = 7;
auto lambda = [=](){
cout << a+b << endl;
}
lambda();
}
Details
- 캡처 블록 내 =를 작성하면, 람다 함수 바디에서 활용하고자 하는 동일 유효범위 내 주변 변수들을 모두 가져옵니다.
- 이때, 일반 함수의 인자 전달 방식과 동일하게, =를 통해 캡처한 변수들의 복제본을 람다 함수 내부에서 활용합니다.
- 값에 의한 캡처는 람다 함수 내부에서 사용하는 변수들을 constant로 취급합니다. 따라서, 해당 변수들은 람다 함수 내부에서 수정이 불가합니다.
2. [&], 참조에 의한 캡처 예제
#include <iostream>
using namespace std;
int main()
{
int a = 5;
int b = 3;
auto lambda = [&](){
cout << a + b << endl;
a++;
b++;
};
lambda(); // a = 5, b = 3, 8 출력
cout << a+b << endl; // a = 6, b = 4, 10 출력
}
Details
- 캡처 블록 내 & 사용은 람다 표현식 내부에서 활용하고자 하는 변수들을 참조를 통해 캡처합니다.
- 일반 함수와 동일한 방식으로, 참조 형식으로 캡처한 변수들을 람다 함수 내부에서 수정할 경우, 원본 값에 영향을 끼칩니다.
3. [&, =], 참조에 의한 캡처와 값에 의한 캡처 예제
int x = 42;
int y = 30;
auto lambda = [&x, =](){
cout << x+y << endl;
x++;
};
lambda();
#3. mutable
1. mutable 예제
#include <iostream>
using namespace std;
int main()
{
double Data = 1.23;
auto lam = [Data]() mutable { Data *= 2; cout << Data << endl; };
lam();
}
Details
- 컴파일러는 "람다 표현식"을 함수 객체로 변환합니다.
- 따라서, "람다 표현식"에서 캡처된 변수는 함수 객체의 멤버 변수가 되며, 변수의 const 설정을 그대로 상속받습니다.
- 더불어, "람다 표현식"의 함수 호출 연산자는 디폴트로 const 설정이 되어있기 때문에, 캡처된 변수가 "non-const"임에도 불구하고 구현 부분에서 값을 변경할 수 없습니다!
- 따라서, 우리는 람다 표현식 작성 중에 캡쳐된 변수의 값을 변경하려면, "mutable" 키워드가 필요합니다!
'언어 > Basic C++' 카테고리의 다른 글
[Basic C++] #46_람다 표현식과 STL 알고리즘 (0) | 2022.07.07 |
---|---|
[Basic C++] #45_람다 표현식 활용, 제네릭 람다 표현식, 람다 캡처 표현식, 리턴 타입으로서 람다 표현식 (0) | 2022.07.06 |
[Basic C++] #43_STL 알고리즘, find, find_if (0) | 2022.07.05 |
[Basic C++] #42_unordered_multimap, 비순차 연관 컨테이너, 중복 허용 (0) | 2022.06.28 |
[Basic C++] #41_unordered_map, 비순차 연관 컨테이너 (0) | 2022.06.28 |