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

C++ 람다 표현식(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) 부분은 람다 표현식이 호출될 때 전달받을 매개변수를 정의하는 역할을 합니다. 대괄호 []는 로컬 스코프(지역 범위)에 있는 변수를 람다 내부 스코프로 전달하는 데 사용되며, 이를 변수 캡처(capturing variables)라고 합니다.

간단한 형태의 람다 표현식은 반환 타입을 자동으로 추론(auto deduction)합니다. 만약 타입을 명시적으로 지정하고 싶다면 아래와 같은 문법을 사용하면 됩니다.

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

주요 캡처 방식

대괄호 안에 어떻게 작성하느냐에 따라 캡처 동작이 달라집니다.

  • [] : 외부 변수를 아무것도 캡처하지 않음
  • [=] : 사용된 모든 외부 변수를 값(value)으로 복사하여 캡처
  • [&] : 사용된 모든 외부 변수를 참조(reference)로 캡처
  • [x] : 특정 변수 x만 값으로 캡처
  • [&x] : 특정 변수 x만 참조로 캡처

람다 표현식을 활용하면 짧고 일회성인 연산을 코드 내에서 즉석으로 정의할 수 있어, STL 알고리즘과 함께 사용할 때 코드의 가독성과 생산성이 크게 향상됩니다.