728x90
람다 함수의 클로저 타입은 람다 함수가 외부 변수를 캡처할 때 생성되는 고유한 타입입니다. 이 타입은 람다 함수 내부에서 사용할 수 있는 변수를 포함하며, 함수 호출 시 캡처된 변수를 사용할 수 있게 합니다.
클로저 타입의 특징
- 익명 타입:
- 람다 함수는 고유한 익명 타입을 가지며, 이 타입은 함수가 정의될 때 컴파일러에 의해 생성됩니다. 따라서 클로저 타입은 이름이 없으며 auto 키워드를 사용해 변수에 할당할 수 있습니다.
- 캡처된 변수:
- 람다는 [ ] 안에 명시된 대로 외부 변수(값 또는 참조)를 캡처합니다. 이렇게 캡처된 변수는 람다 함수가 외부 상태를 유지하거나 접근할 수 있도록 해 줍니다.
- 상태 유지:
- 람다 함수는 캡처한 변수를 통해 상태를 유지하며, 캡처된 값은 람다 함수가 여러 번 호출될 때 동일하게 유지됩니다.
- 일반 함수와의 차이:
- 일반 함수는 외부 변수를 직접 참조할 수 없습니다. 반면, 람다 함수는 캡처를 통해 외부 변수에 접근하여 값을 참조하거나 수정할 수 있습니다.
- 함수 객체로의 변환:
- 클로저 타입의 람다는 함수 객체로 취급됩니다. 따라서 표준 라이브러리의 std::function 타입을 통해 람다를 함수 포인터로 사용할 수 있습니다.
예제
다음 예제에서 클로저 타입의 동작 방식을 보여줍니다.
#include <iostream>
int main() {
int x = 10;
// 람다 함수가 x를 복사 캡처합니다.
auto lambda = [x]() {
std::cout << "Captured value: " << x << std::endl;
};
lambda(); // "Captured value: 10" 출력
return 0;
}
클로저 타입과 mutable 키워드
기본적으로 람다 캡처 변수는 const로 처리됩니다. 만약 람다 내부에서 캡처된 변수를 수정해야 할 경우 mutable 키워드를 사용하여 캡처 변수를 변경할 수 있습니다.
#include <iostream>
int main() {
int x = 10;
auto lambda = [x]() mutable {
x += 5;
std::cout << "Modified captured value: " << x << std::endl;
};
lambda(); // "Modified captured value: 15" 출력
return 0;
}
위의 예제에서 mutable 키워드를 사용하여 x 값을 변경할 수 있습니다. 캡처된 변수는 내부적으로 복사된 값이므로, 원래의 x 값에는 영향을 주지 않습니다.
std::function과 람다 클로저 타입
클로저 타입은 익명 타입이므로 직접 함수 포인터로 사용하기 어려울 수 있습니다. 이 경우 std::function을 통해 람다를 함수 포인터처럼 사용할 수 있습니다.
#include <iostream>
#include <functional>
int main() {
int x = 20;
std::function<void()> lambda = [x]() {
std::cout << "Captured value in std::function: " << x << std::endl;
};
lambda(); // "Captured value in std::function: 20" 출력
return 0;
}
결론
람다 함수의 클로저 타입은 캡처한 변수를 관리하여 람다 함수가 외부 상태와 상호작용할 수 있게 해줍니다. 이를 통해 코드의 간결성과 유연성을 높여주며, 함수 객체처럼 사용되어 함수형 프로그래밍 스타일을 C++에서 효과적으로 구현할 수 있습니다.
728x90
'C++' 카테고리의 다른 글
[C++] 친구(friends) 함수 (2) | 2024.11.12 |
---|---|
[C++] noexcept (0) | 2024.11.11 |
[C++] 람다(lambda) 함수 (0) | 2024.11.09 |
[C++] maybe_unused (1) | 2024.11.08 |
[C++] noreturn함수 (0) | 2024.11.07 |