람다??
람다식은 흔히 이름없는 함수, 일회용 함수라고 부른다. 어째서 이런 식으로 부르는 걸까?
람다의 특징
람다의 가장 큰 특징은 함수명을 선언하고 사용하는 것이 아닌 식별자 없이 실행가능한 함수라는 것이다. 말 그대로 함수를 선언하지 않고 그냥 사용한다.
람다 표현식의 형태
람다식은 내용이 없으면 정말 기괴한 형태를 띄고있다.
[ ] ( ) { } ( )
각각 [캡처] (매개변수) { 함수 로직 } (호출) 이라는 뜻을 가지고 있다.
호출은 필수가 아니다!
예시
호출 O: [](int a, int b) { return a + b }(1,2)
호출 X: [](int a, int b) { return a + b }
이런식으로 사용한다.
캡처 영역
그럼 캡처 영역엔 도대체 어떤게 들어갈까?
캡처영역은 기존에 존재하던 변수들을 람다 함수 안에서 사용하고 싶을 때 사용하는 영역이다.
캡처 방식엔 우리에게 친숙한 값 방식, 참조 방식 2가지가 있다! 각각 =, & 기호를 통해 사용한다.
int tmp1, tmp2, tmp3, tmp4;
[=](int a, int b){ return a + b - tmp1; } // 모든 외부 변수 값 형식으로 사용
[&](int a, int b){ return a + b - tmp1; } // 모든 외부 변수 참조 형식으로 사용
[=, &tmp2](int a, int b){ return a + b - tmp1; } // tmp 2는 참조, 모든 외부 변수 값 형식으로 사용
이런 식으로 사용한다. 그냥 변수명만 적으면 값 형식이 적용된다.
어디서 사용해???
간혹 함수 매개변수로 funcion자료형이 들어갈 수 있다. function자료형은 함수를 객체화 시킨 자료형이다.
void Doit(int a, function<void(int&)> func){
func(a);
}
이 때, 람다식이 없다면?? 어떤 식으로 호출 해야할까?
void Doit(int a, function<void(int&)> func){
func(a);
}
void func1(int& a){
a *= 100;
}
int main() {
int tmp = 10;
Doit(tmp,func1);
}
이런 식으로 함수를 하나 만들어서 호출 해야한다. 하지만 람다식을 이용한다면 함수 생성 없이 그자리에서 일회용으로 만들어 사용할 수 있다!
void Doit(int a, function<void(int&)> func){
func(a);
}
int main() {
int tmp = 10;
Doit(tmp,[](int& a){ a*=100; });
}
마무리
람다 표현식은 다양한 곳에서 사용한다. 수많은 함수를 선언해가며 사용할 수 없기 때문이다. 또한 콜백함수를 사용하는 곳이라면 더더욱 많이 쓰이니 알아두자!
'C++' 카테고리의 다른 글
스마트 포인터를 이해해보자 (4) | 2023.10.02 |
---|