C++

[C++] 람다(lambda) 함수

코딩 메모장 2024. 11. 9. 22:13
728x90

C++에서 람다(Lambda) 함수는 익명 함수(Anonymous Function) 또는 즉석 함수(Inline Function)를 정의할 수 있는 기능입니다. C++11에서 도입되었으며, 코드를 간결하게 작성하고, 간단한 함수가 필요한 경우 즉석에서 정의할 수 있습니다. 람다는 특히 STL 알고리즘 함수와 함께 사용할 때 유용합니다.

기본 구문

람다의 기본 구조는 다음과 같습니다.

[capture](parameters) -> return_type {
    // 함수 본체
}
  • capture: 외부 변수를 캡처하는 방법을 정의하며, [&] (모든 변수 참조 캡처), [=] (모든 변수 복사 캡처), [x] (특정 변수 복사 캡처)와 같은 방식이 있습니다.
  • parameters: 함수의 매개변수를 정의합니다.
  • return_type: 반환 타입을 지정하며, 생략 가능하고, 컴파일러가 자동으로 추론할 수 있습니다.
  • 함수 본체: 함수가 수행할 작업을 정의합니다.

예제

기본적인 람다 사용

#include <iostream>

int main() {
    auto hello = []() {
        std::cout << "Hello, World!" << std::endl;
    };

    hello(); // "Hello, World!" 출력
    return 0;
}

 

매개변수가 있는 람다

#include <iostream>

int main() {
    auto add = [](int a, int b) {
        return a + b;
    };

    std::cout << add(3, 4) << std::endl; // 7 출력
    return 0;
}

 

외부 변수 캡처

#include <iostream>

int main() {
    int x = 10;
    auto print_x = [&]() {
        std::cout << "x: " << x << std::endl;
    };

    print_x(); // x: 10 출력
    return 0;
}

 

복합 캡처

#include <iostream>

int main() {
    int a = 1, b = 2;
    auto sum = [a, &b]() {
        return a + b; // a는 복사, b는 참조로 캡처
    };

    b = 3; // b 값을 변경
    std::cout << sum() << std::endl; // 4 출력 (1 + 3)
    return 0;
}

고급 사용 예시

람다는 STL 알고리즘 함수와 함께 사용하면 코드의 가독성과 간결성을 높일 수 있습니다. 예를 들어, std::for_each와 함께 사용할 수 있습니다.

#include <iostream>
#include <vector>
#include <algorithm>

int main() {
    std::vector<int> numbers = {1, 2, 3, 4, 5};

    // 람다를 사용해 요소 출력
    std::for_each(numbers.begin(), numbers.end(), [](int n) {
        std::cout << n << " ";
    });
    std::cout << std::endl;

    return 0;
}

람다 표현식에서 반환 타입 명시

람다는 복잡한 연산을 수행할 때 반환 타입을 명시해야 할 경우가 있습니다. 이를 위해 -> 뒤에 반환 타입을 지정할 수 있습니다.

#include <iostream>

int main() {
    auto divide = [](int a, int b) -> double {
        return (b != 0) ? static_cast<double>(a) / b : 0.0;
    };

    std::cout << divide(10, 3) << std::endl; // 3.33333 출력
    return 0;
}

람다 캡처 리스트에서 변수 수정

캡처 리스트에서 외부 변수를 복사하여 가져오는 경우, 기본적으로 변수는 const로 처리됩니다. 변경이 필요할 경우 mutable 키워드를 사용할 수 있습니다.

#include <iostream>

int main() {
    int count = 0;
    auto increment = [count]() mutable {
        count++;
        std::cout << "Count: " << count << std::endl;
    };

    increment(); // Count: 1
    increment(); // Count: 2
    std::cout << "Original count: " << count << std::endl; // 0 출력
    return 0;
}

std::function과의 조합

람다 함수는 std::function과 함께 사용하여 더 유연한 함수 객체로 활용할 수 있습니다. 특히 재귀적인 람다 함수 정의에 유용합니다.

#include <iostream>
#include <functional>

int main() {
    std::function<int(int)> factorial = [&](int n) {
        return (n <= 1) ? 1 : n * factorial(n - 1);
    };

    std::cout << "5! = " << factorial(5) << std::endl; // 120 출력
    return 0;
}

결론

람다 함수는 코드의 간결성과 가독성을 높여주는 C++의 중요한 기능입니다. 다양한 캡처 방식을 제공해 외부 변수의 제어 권한을 세밀하게 설정할 수 있으며, 특히 STL 알고리즘과 함께 사용하면 코드가 간결해집니다. std::function과의 조합, mutable 키워드, 반환 타입 명시 등을 통해 람다 함수를 더욱 강력하게 활용할 수 있습니다. 

728x90

'C++' 카테고리의 다른 글

[C++] noexcept  (0) 2024.11.11
[C++] 람다 함수의 클로저 타입  (0) 2024.11.10
[C++] maybe_unused  (1) 2024.11.08
[C++] noreturn함수  (0) 2024.11.07
[C++] 범위기반 for문  (4) 2024.11.06