Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C++11 람다 표현식(Lambda Expression)이란? 개념과 사용법 총정리

C++ STL에는 std::for_each처럼 유용하게 활용할 수 있는 범용 함수들이 포함되어 있습니다. 하지만 이러한 함수들은 실제로 사용하기가 다소 번거로울 수 있습니다. 특히 적용하려는 함수 객체(functor)가 해당 함수에서 딱 한 번만 사용될 경우 더욱 그렇습니다.

단 한 곳에서만 사용할 함수를 위해 네임스페이스에 별도로 정의해 두는 것은 비효율적입니다. 이러한 문제를 해결하는 방법이 바로 익명 함수(anonymous function)입니다.

람다 표현식의 등장

C++11부터 도입된 람다 표현식(lambda expression)을 사용하면 이름 없는 익명 함수를 코드 내에서 간결하게 작성할 수 있습니다. 별도의 함수 객체를 정의하지 않고도 필요한 위치에서 즉석으로 함수 로직을 전달할 수 있어 코드의 가독성과 생산성이 크게 향상됩니다.

기본 예제

#include<iostream>
#include<vector>
#include <algorithm> // for_each

using namespace std;

int main() {
    vector<int> myvector;
    myvector.push_back(1);
    myvector.push_back(2);
    myvector.push_back(3);

    for_each(myvector.begin(), myvector.end(), [](int x) {
        cout << x*x << endl;
    });
}

실행 결과

위 코드를 실행하면 다음과 같은 출력 결과를 얻을 수 있습니다.

1
4
9

람다 표현식의 구성 요소

위 예제에서 핵심적인 요소들을 살펴보겠습니다.

(int x) 부분은 람다 표현식이 호출될 때 전달받을 매개변수를 정의하는 역할을 합니다.

[]는 외부 지역 스코프(local scope)에 있는 변수를 람다 내부 스코프로 가져오는 데 사용되며, 이를 변수 캡처(capturing variables)라고 부릅니다. 대괄호 안에 캡처할 변수를 지정하거나, =(값 복사) 또는 &(참조) 방식으로 캡처 방식을 설정할 수 있습니다.

또한 표현식이 단순한 경우 컴파일러가 반환 타입을 자동으로 추론(auto deduction)합니다.

반환 타입 명시하기

반환 타입을 자동 추론에 맡기지 않고 명시적으로 지정하고 싶다면 아래와 같은 구문을 사용하면 됩니다.

[](int x) -> double {
    return x/2.0;
}

-> 뒤에 원하는 타입을 작성하면 해당 람다의 반환 타입이 명확하게 결정됩니다.

마무리

람다 표현식은 C++11 이후 현대 C++ 프로그래밍에서 필수적인 기능으로 자리 잡았습니다. STL 알고리즘과 함께 사용하면 반복문 없이도 간결하고 직관적인 코드를 작성할 수 있습니다.

C++ 람다에 대해 더 깊이 학습하고 싶다면 아래 StackOverflow 스레드를 참고해 보세요.
https://stackoverflow.com/questions/7627098/what-is-a-lambda-expression-in-c11