오늘은 C++에서 람다 표현식(Lambda Expression)을 자세히 알아보는 시간을 가져보자 왜 또 C++을 공부하기로 하였을까
C++에서 람다는 익명 함수(Anonymous Function)로, 코드 내에서 일시적으로 사용될 수 있는 간단한 함수이다
오늘 알아보기
1. 람다 표현식이란?
2. 간단한 람다 표현식 알아보기
3. 변수 캡처하기
4. 참조로 변수 캡처하기
5. 모든 변수 캡처하기
람다 표현식은 익명 함수로, 코드 내에서 함수처럼 사용할 수 있다
특히 간단한 연산, 콜백 함수, STL 알고리즘과의 연동 등에 매우 유용하다
[캡처 리스트](매개변수 리스트) -> 반환형 {
함수 본문
}
- 캡처 리스트: 외부 변수를 람다 안에서 사용할 수 있게 만들어 준다
- 매개변수 리스트: 함수처럼 매개변수를 받는 역할이다
- 반환형: 함수의 반환형을 지정할 수 있으며, 생략할 수도 있다
- 함수 본문: 람다가 수행할 코드를 작성하는 본문이다
람다 표현식의 가장 기본적인 형태를 알아보자 이 예제에서는 매개변수도, 캡처 리스트도 없이 단순히 값을 출력하는 람다 표현식이다
#include <iostream>
int main() {
// 간단한 람다 표현식
auto Hello = []() {
std::cout << "Hello!" << std::endl;
};
// 람다 호출
Hello();
return 0;
}
- []: 람다의 캡처 리스트이다 (여기서는 외부 변수를 캡처하지 않기 때문에 빈 상태로 두었다)
- () {}: 람다의 매개변수 리스트와 함수 본문이다 매개변수 없이 간단히 "Hello, Lambda!"를 출력하는 코드이다
이 예제의 출력은 다음과 같다
Hello!
람다 표현식은 외부 변수를 캡처하여 사용할 수 있다 이를 통해 함수 외부에서 선언된 변수도 람다 내부에서 활용할 수 있다
#include <iostream>
int main() {
int x = 10;
// 외부 변수 x를 캡처한 람다
auto captureX = [x]() {
std::cout << "Captured x: " << x << std::endl;
};
captureX();
return 0;
}
- [x]: 캡처 리스트에 변수를 명시함으로써, 람다 표현식 안에서 외부 변수 x를 사용할 수 있게 된다
- 값 캡처: [x]와 같이 변수를 값으로 캡처하면, 외부 변수의 복사본이 람다 안에서 사용된다
출력은 다음과 같다
Captured x: 10
때로는 값이 아닌 참조로 변수를 캡처해야 할 경우가 있다 이때는 캡처 리스트에 변수를 참조로 전달할 수 있다
#include <iostream>
int main() {
int x = 10;
// x를 참조로 캡처
auto captureXRef = [&x]() {
x += 5;
std::cout << "Modified x: " << x << std::endl;
};
captureXRef(); // x의 값이 15로 변경됩니다.
std::cout << "Final x: " << x << std::endl;
return 0;
}
- [&x]: 캡처 리스트에서 변수를 참조로 캡처한다 이 경우에는 람다 표현식 안에서 변수 x의 값을 직접 변경할 수 있다
출력은 다음과 같다
Modified x: 15
Final x: 15
여러 변수를 캡처할 때 캡처 리스트를 간단히 할 수 있는 방법이 있다 [=] 또는 [&]를 사용하여 모든 외부 변수를 값으로 캡처하거나 참조로 캡처하는 방법이다
#include <iostream>
int main() {
int a = 1, b = 2, c = 3;
// 모든 변수를 값으로 캡처한다
auto captureAllByValue = [=]() {
std::cout << "a + b + c = " << (a + b + c) << std::endl;
};
// 모든 변수를 참조로 캡처한다
auto captureAllByReference = [&]() {
a += 10;
b += 10;
c += 10;
};
captureAllByValue(); // 값 캡처는 원래 값 사용
captureAllByReference(); // 참조 캡처는 원래 변수 값 변경
captureAllByValue(); // 값 캡처이므로 여전히 원래 값이 출력된다
std::cout << "Modified values: a = " << a << ", b = " << b << ", c = " << c << std::endl;
return 0;
}
- [=]: 모든 외부 변수를 값으로 캡처한다
- [&]: 모든 외부 변수를 참조로 캡처한다
출력은 다음과 같다
a + b + c = 6
a + b + c = 6
Modified values: a = 11, b = 12, c = 13
오늘 알아본 C++의 람다 표현식은 언리얼 엔진에서 게임 로직을 단순화하는데 주로 사용된다
일반 함수는 선언하는 부분과 정의하는 부분을 따로 작성해야 하는 반면 람다 표현식은 마치 우리가 지하철 일회용 티켓을 사용하듯이 그 자리에서 즉시 사용이 가능하다는 것이 다양한 함수를 사용하는 게임에 적합하다고 느껴졌다
하지만 오늘 알아본 유용한 람다 표현식은 람다 표현식의 일부분에 불과하다 고로 다음 시간에는
- 반환형 지정
- STL 알고리즘과 람다 표현식의 활용
에 대해 마저 알아보는 시간을 가져보자
특별편: 언리얼 엔진에서 C++로 캐릭터 AI 만들기 (2) | 2024.10.19 |
---|---|
C++ 예외처리 (2) | 2024.09.28 |
C++ 람다 표현식 사용하기(2) (0) | 2024.09.07 |
언리얼 엔진과 C++의 연산자 오버로딩 (0) | 2024.08.17 |
C++이란 어떤 언어일까? (0) | 2024.08.11 |