C++에서 lambda 표현식의 사용법은?
_____---
Q1: C++에서 람다 표현식이란 무엇인가요?
A1: 람다 표현식(lambda expression)은 익명 함수(이름 없는 함수)를 정의하는 문법입니다. 코드 내에서 즉시 사용할 수 있는 작은 함수 객체를 생성하며, 주로 일회성 함수, 콜백, 알고리즘과의 연동에 자주 사용됩니다.
---
Q2: 람다 표현식의 기본 문법은 어떻게 되나요?
A2: 기본 형태는 다음과 같습니다.
```cpp
[capture](parameters) -> return_type {
// 함수 본문
};
```
- `capture`: 람다가 외부 변수에 접근할 때 그 방식을 지정 (예: 값 복사, 참조)
- `parameters`: 함수 매개변수 목록
- `return_type`: 반환 타입 (종종 생략 가능)
- 함수 몸체 내에 구현 코드를 작성
---
Q3: 람다에서 capture란 무엇이며 어떤 종류가 있나요?
A3: 람다가 자신이 선언된 외부 컨텍스트의 변수에 접근하는 방식을 지정합니다. 주요 capture 종류:
- `[=]`: 외부 변수 모두를 값으로 복사해서 캡처
- `[&]`: 외부 변수 모두를 참조로 캡처
- `[x, &y]`: 변수 x는 값 복사, y는 참조로 캡처
- `[this]`: 현재 클래스 객체 포인터(this)를 캡처 (멤버 접근용)
---
Q4: 람다에서 반환 타입을 명시하지 않아도 되나요?
A4: 네, 대부분의 경우 컴파일러가 자동으로 반환 타입을 추론합니다. 단일 반환문이 있거나 명확한 반환이 있는 경우 생략 가능합니다. 복잡한 경우 `-> 반환형`을 명시해야 합니다.
예:
```cpp
auto f = [](int x) { return x * 2; }; // 반환형 int 자동 추론
```
---
Q5: 람다를 변수에 저장하려면 어떻게 하나요?
A5: 람다 표현식을 변수에 저장하려면 `auto` 키워드를 사용하거나, 명시적으로 함수 객체 타입(`std::function`)을 지정할 수 있습니다.
```cpp
auto lambda = [](int x) { return x + 1; };
int result = lambda(5); // result = 6
```
또는
```cpp
std::function
```
---
Q6: 람다를 함수에 인자로 전달하려면?
A6: 람다는 함수 객체이므로, 함수의 인자로 직접 전달 가능합니다.
```cpp
void func(std::function
f(10);
}
func([](int x) { std::cout << x << "\n"; });
```
템플릿 함수에서는 더 간결하게 인자를 받을 수 있습니다.
---
Q7: 람다 내부에서 외부 변수를 수정하려면 어떻게 하나요?
A7: 외부 변수를 참조 캡처(`[&]`)로 받아야 하며, 람다 내에서 수정 가능합니다.
```cpp
int count = 0;
auto lambda = [&count]() { count++; };
lambda();
값 캡처(`[=]`) 시에는 람다가 복사본을 받아서 수정해도 외부 변수는 변하지 않습니다.
---
Q8: 람다 표현식을 멤버 함수처럼 사용하려면?
A8: 클래스 내부에서 `[this]`를 캡처하여 멤버 변수, 함수에 접근할 수 있습니다.
```cpp
struct S {
int x = 10;
void foo() {
auto lambda = [this]() { return x + 5; };
std::cout << lambda() << "\n"; // 15 출력
}
};
```
---
Q9: 람다에서 매개변수를 생략하거나 기본값을 줄 수 있나요?
A9: 람다 내부 매개변수는 일반 함수처럼 타입과 개수를 지정해야 하며, 기본매개변수도 가능합니다.
```cpp
auto f = [](int x = 5) { return x * 2; };
std::cout << f() << "\n"; // 10 출력
```
---
Q10: 람다에서 mutable 키워드는 무슨 역할 하나요?
A10: 기본적으로 값 캡처된 변수들은 람다 내부에서 `const`처럼 취급되어 변경할 수 없습니다. `mutable` 키워드를 붙이면 내부에서 값 캡처된 변수들을 변경할 수 있습니다. 단, 외부 변수에 직접 영향은 없습니다.
```cpp
int x = 10;
auto f = [x]() mutable { x += 5; std::cout << x << "\n"; };
f(); // 15
std::cout << x << "\n"; // 10 (외부 변수는 변하지 않음)
```
---
Q11: 람다의 반환 타입을 명시해야 하는 경우는 언제인가요?
A11: 람다 내부에 여러 개의 반환문이 있거나, `if`/`switch` 문 등으로 복잡할 경우 반환 타입이 명확하지 않으므로 명시가 필요합니다.
```cpp
auto f = [](int x) -> double {
if (x > 0) return x * 2.0;
else return 0.0;
};
```
---
Q12: 람다가 이식 가능한 함수 객체인가요?
A12: 네, 람다는 익명 함수 객체이며, `operator()`를 가지고 있어 일반 함수 객체처럼 사용 가능합니다. STL 알고리즘, 스레드, 콜백 등에 바로 전달할 수 있습니다.
---
Q13: 람다 내에서 비동기 작업 시 주의사항이 있나요?
A13: 람다가 캡처한 변수가 스코프를 벗어난 후 비동기 실행되면 위험합니다. 값 캡처라도 포인터/참조 객체는 유효성 확인이 필요하며, 참조 캡처 시 특히 조심해야 합니다.
---
Q14: 람다를 재귀적으로 사용하려면?
A14: 일반 람다는 자기 자신을 참조할 이름이 없기 때문에 직접 재귀가 어렵습니다. 이때는 `std::function`을 사용하여 람다를 정의합니다.
```cpp
std::function
return (n <= 1) ? 1 : n * factorial(n - 1);
};
```
---
Q15: 람다 캡처에 이름이 없는 변수를 사용해도 되나요?
A15: 예를 들어 임시 객체 또는 함수 반환값을 캡처할 수 없습니다. 캡처는 반드시 스코프 내 변수만 가능합니다.
---
이상으로 C++ 람다 표현식에 관한 핵심적인 사용법과 자주 묻는 질문들을 정리했습니다. 필요에 따라 예제를 실습해보면서 이해하는 것을 추천드립니다.
람다 표현식은 주로 코드의 가독성을 높이고, 일회성 함수나 콜백을 정의할 때 유용합니다.
이 글에서는 C++에서 람다 표현식을 사용하는 방법과 그 특징에 대해 자세히 설명하겠습니다.
람다 표현식의 기본 문법 람다 표현식의 기본 문법은 다음과 같습니다: ```cpp [capture](parameters) -> return_type { // 함수 본체 } ``` - capture : 외부 변수를 캡처하는 방법을 정의합니다.
이 부분은 생략할 수 있습니다.
- parameters : 람다 함수가 받을 매개변수를 정의합니다.
이 부분도 생략할 수 있습니다.
- return_type : 반환 타입을 명시합니다.
C++에서는 반환 타입을 생략할 수 있으며, 컴파일러가 자동으로 추론합니다.
- 함수 본체 : 람다 함수의 실제 코드가 들어가는 부분입니다.
캡처 리스트 캡처 리스트는 외부 변수를 람다 함수 내부에서 사용할 수 있도록 하는 방법입니다.
캡처 리스트는 다음과 같은 방식으로 정의할 수 있습니다: 1. 값으로 캡처 : `[x]`와 같이 특정 변수를 값으로 캡처합니다.
2. 참조로 캡처 : `[&x]`와 같이 특정 변수를 참조로 캡처합니다.
3. 모든 변수를 값으로 캡처 : `[=]`를 사용하여 모든 외부 변수를 값으로 캡처합니다.
4. 모든 변수를 참조로 캡처 : `[&]`를 사용하여 모든 외부 변수를 참조로 캡처합니다.
5. 혼합 캡처 : `[x, &y]`와 같이 특정 변수는 값으로, 다른 변수는 참조로 캡처할 수 있습니다.
예제 다음은 람다 표현식을 사용하는 간단한 예제입니다: ```cpp include
`std::count_if` 함수는 이 람다 함수를 사용하여 `numbers` 벡터에서 `threshold`보다 큰 숫자의 개수를 계산합니다.
반환 타입 C++에서는 람다 표현식의 반환 타입을 명시적으로 지정할 수 있습니다.
예를 들어, 다음과 같이 사용할 수 있습니다: ```cpp auto add = [](int a, int b) -> int { return a + b; }; ``` 위의 예제에서 `add` 람다 함수는 두 개의 정수를 받아서 그 합을 반환합니다.
반환 타입을 명시적으로 지정하지 않으면, 컴파일러가 자동으로 반환 타입을 추론합니다.
고급 사용법 람다 표현식은 다양한 상황에서 유용하게 사용될 수 있습니다.
예를 들어, STL 알고리즘과 함께 사용할 때 매우 강력한 도구가 됩니다.
다음은 `std::sort`와 함께 사용하는 예제입니다: ```cpp include
람다 표현식은 코드의 가독성을 높이고, 일회성 로직을 간결하게 표현할 수 있게 해줍니다.
결론 C++에서 람다 표현식은 함수 객체를 간편하게 정의할 수 있는 강력한 도구입니다.
외부 변수를 캡처하고, STL 알고리즘과 함께 사용하여 코드의 가독성을 높이며, 일회성 로직을 간결하게 표현할 수 있습니다.
C++11 이후로 람다 표현식은 C++ 프로그래밍에서 필수적인 요소가 되었으며, 다양한 상황에서 유용하게 활용될 수 있습니다.
작성자:
김지후 [비회원]
| 작성일자: 1년 전
2024-09-20 17:11:31
조회수: 174 | 댓글: 0 | 좋아요: 0 | 싫어요: 0
조회수: 174 | 댓글: 0 | 좋아요: 0 | 싫어요: 0
내용이 부정확하다면 싫어요를 클릭해주세요.