C++

[C++] 람다 함수의 클로저 타입

코딩 메모장 2024. 11. 10. 21:02
728x90

람다 함수의 클로저 타입은 람다 함수가 외부 변수를 캡처할 때 생성되는 고유한 타입입니다. 이 타입은 람다 함수 내부에서 사용할 수 있는 변수를 포함하며, 함수 호출 시 캡처된 변수를 사용할 수 있게 합니다.

클로저 타입의 특징

  1. 익명 타입:
    • 람다 함수는 고유한 익명 타입을 가지며, 이 타입은 함수가 정의될 때 컴파일러에 의해 생성됩니다. 따라서 클로저 타입은 이름이 없으며 auto 키워드를 사용해 변수에 할당할 수 있습니다.
  2. 캡처된 변수:
    • 람다는 [ ] 안에 명시된 대로 외부 변수(값 또는 참조)를 캡처합니다. 이렇게 캡처된 변수는 람다 함수가 외부 상태를 유지하거나 접근할 수 있도록 해 줍니다.
  3. 상태 유지:
    • 람다 함수는 캡처한 변수를 통해 상태를 유지하며, 캡처된 값은 람다 함수가 여러 번 호출될 때 동일하게 유지됩니다.
  4. 일반 함수와의 차이:
    • 일반 함수는 외부 변수를 직접 참조할 수 없습니다. 반면, 람다 함수는 캡처를 통해 외부 변수에 접근하여 값을 참조하거나 수정할 수 있습니다.
  5. 함수 객체로의 변환:
    • 클로저 타입의 람다는 함수 객체로 취급됩니다. 따라서 표준 라이브러리의 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