언리얼 엔진 공부를 하다 AddLambda라는 함수를 사용하게 되었습니다 C#에서 얼핏 공부했던 기억이 남아 다시 공부하고자 글을 써봅니다(C++기반으로 공부했습니다 C#과는 개념이 다를수 있습니다)
람다식이란 정식적으로 함수를 선언하고 사용하는 방식이 아닌 필요한 지점에서 함수를 만들어 사용하는 방식입니다 이과정중 접근제한자, 반환형, 식별자들이 생략되는 익명함수이며, 일회용 함수입니다
이렇다면 이러한 람다식은 왜쓰이는건가 단 한번만쓰이는 함수는 굳이 정의하지않고 필요한 부분에서 람다로 사용함으로써 재활용을 못하게 하고, 코드를 쭉쭉읽일수 있게 한다는 장점이있습니다
이러한 장점들이있지만 사용이 편리하게 하다보면 그 편리함이 오히려 단점이 되는데요 람다 같은경우는 익명 함수이기때문에 디버깅시 어떤 람다에서 오류가 발생했는지 찾기 힘들다는 단점과 람다 자체의 일회용성때문에 난발하다보면 일회용 함수를 여러개 만들어서 사용하고있는 오류를 범할 수 있습니다.
그렇다면 언제 람다를 사용해야 할까요? 가능 하면 최대한 사용하지않고 최대한 짧은 코드에서 사용하는 방식이 람다의 올바른 사용방식이라고 합니다
그렇다면 어떻게 사용하는지 기본적인 코드를 알아보겠습니다
#include<iostream>
using namespace std;
template<typename T>
int LowNum(const int arr[], int n, T f)
{
int min = f(arr[0]);
for (int i = 1; i < n; i++)
{
if (f(arr[i] < min))
{
min = f(arr[i]);
}
}
return min;
}
int myFunc(int n)
{
return n * n;
}
int main()
{
int arr[5] = { 4,2,3,6,9 };
cout << LowNum(arr, 5, myFunc) << endl;
cout << LowNum(arr, 5, [](int n)->int {return n * n; }) << endl;
}
위와 같은 방식으로 기본적인 람다식을 사용할 수 있는데요 조금더 자세하게 람다식 문법을 알아보겠습니다
[캡쳐 블록](파라미터) mutable 익셉션_목록 -> 리턴 타입 { 바디 }
캡쳐 블록 | 람다 함수 안에 참조할 바깥 변수를 지정합니다. 여기서 지정한 변수를 함수 바디에서 호출 할 수 있습니다. |
파라미터 | 함수 바디에서 사용될 파라미터입니다 |
mutable(생략 가능) | 캡쳐 블록에서 복사한 복제본은 const 타입이기 때문에 수정이 불가능한데 해당 키워드를 추가하면 const 속성이 제거되어 수정 할 수 있습니다 |
익셉션 목록(생략 가능) | 람다 표현시에서 throw할 수 있는 익셉션의 종류를 지정합니다 |
리턴 타입(생략 가능) | 리턴 타입입니다 생략하면 컴파일러가 자동으로 지정해줍니다 |
바디 | 함수 바디입니다 실행되어질 구문입니다 |
생소한 캡쳐 블록에 대해서 알아보겠습니다
람다는 호출되는 스코프 범위에서 존재하는 변수들을 캡쳐 할 수 있습니다. 그리고 대상을 값(value)로 캡쳐할지,참조(reference)로 캡쳐할지 설정 할 수 있습니다
- [=]
- 스코프 내의 모든 변수를 값(value)으로 복사합니다.
- 멤버함수에서 람다가 호출 된다면 this 포인터로도 가능합다[this]
- [&]
- 스코프 내의 모든 변수를 참조로 복사합니다
값으로 켭쳐된 값을 수정하려면 mutable 키워드를 사용하면됩니다(가급적이면 참조로 복사)
- [&a]
- 변수 a만 참조로 캡쳐합니다
- [a]
- 변수 a만 값으로 캡쳐 합니다
- [=, &a]
- 모든 변수는 값으로 캡쳐하고 변수 a만 참조로 캡쳐합니다
- [&, a]
- 모든 변수는 참조로 캡쳐하고 변수 a만 값으로 캡쳐합니다
- [this]
- 클래스 멤버 함수인 경우 자기 자신을 전달합니다 ([=]과 동일)
'Language > C++ 그때그때 끄적끄적' 카테고리의 다른 글
[C++] 문자열 나누기 spring split (0) | 2023.05.15 |
---|---|
[C++] Iterator 반복자 (0) | 2023.05.10 |
[C++]Struct 와 Class (0) | 2022.01.18 |
[C++]typedef (0) | 2022.01.11 |
[C++]키워드(Keyward) 식별자 그리고 예약어 (0) | 2022.01.10 |