프로그래밍/C,C++

[Modern C++] 람다 표현식 (Lambda Expression)

GONII 2025. 3. 26. 14:33

1. 람다 표현식이란?

람다(lambda) 표현식은 익명 함수(Anonymous Function) 를 생성할 수 있는 기능으로, 함수 객체보다 간결하게 함수를 정의하고 사용할 수 있도록 지원합니다.

📌 람다의 주요 특징:
이름이 없는 함수(익명 함수)
즉시 정의 및 호출 가능
변수 캡처 기능 (클로저)
std::function과 함께 활용 가능


2. 기본 문법

[캡처](매개변수) -> 반환타입 { 함수 본문 };

📌 각 부분 설명:

  • [캡처] : 외부 변수 사용 방법 지정
  • (매개변수) : 입력값 (함수 매개변수와 동일)
  • -> 반환타입 : 함수의 반환 타입 (생략 가능)
  • { 함수 본문 } : 람다의 실행 코드

3. 람다 기본 사용법

#include <iostream>

int main() {
    auto add = [](int a, int b) -> int { return a + b; };
    std::cout << add(3, 4) << std::endl; // 7
}

설명:

  • [](int a, int b) -> int { return a + b; }
  • 두 개의 정수를 받아 더한 값을 반환하는 람다

📌 반환 타입 생략 가능 (자동 유추)

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

4. 캡처(Capture)

람다는 외부 변수를 캡처할 수 있습니다.

캡쳐 방식 설명
[=] 모든 외부 변수를 값(value) 캡처
[&] 모든 외부 변수를 참조(reference) 캡처
[x] 변수 x만 값(value) 캡처
[&x] 변수 x만 참조(reference) 캡처
[=, &y] 기본적으로 값 캡처, y만 참조 캡처
[&, x] 기본적으로 참조 캡처, x만 값 캡처

📌 값 캡처 (Copy Capture)

#include <iostream>

int main() {
    int x = 10;
    auto lambda = [=]() { std::cout << x << std::endl; };
    lambda(); // 10
}

설명:

  • [=]을 사용하면 외부 변수 x가 복사(copy) 되어 람다 내부에서 사용됨.
  • x가 변경되더라도 람다 내부의 값은 영향을 받지 않음.

📌 참조 캡처 (Reference Capture)

int main() {
    int x = 10;
    auto lambda = [&]() { x += 5; };
    lambda();
    std::cout << x << std::endl; // 15
}

설명:

  • [&]을 사용하면 외부 변수 x를 참조(reference) 하므로 직접 수정 가능.

📌 혼합 캡처

int main() {
    int a = 10, b = 20;
    auto lambda = [=, &b]() { b += a; };
    lambda();
    std::cout << b << std::endl; // 30
}

설명:

  • a는 값 캡처 (수정 불가), b는 참조 캡처 (수정 가능).

5. 람다와 std::function

람다는 std::function을 활용하여 저장 가능.

#include <iostream>
#include <functional>

int main() {
    std::function<int(int, int)> add = [](int a, int b) { return a + b; };
    std::cout << add(5, 6) << std::endl; // 11
}

설명:

  • std::function<int(int, int)>을 사용해 람다를 저장 후 호출 가능.

6. 람다를 이용한 정렬

람다는 STL과 함께 사용하여 코드 간결화 가능.

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

int main() {
    std::vector<int> v = {3, 1, 4, 1, 5, 9};
    
    std::sort(v.begin(), v.end(), [](int a, int b) { return a > b; }); // 내림차순 정렬

    for (int n : v) std::cout << n << " "; // 9 5 4 3 1 1
}

설명:

  • std::sort의 비교 함수로 람다 사용하여 내림차순 정렬.

7. 람다를 반환하는 함수

람다를 반환할 수도 있음.

auto getLambda() {
    return [](int x) { return x * x; };
}

int main() {
    auto square = getLambda();
    std::cout << square(5) << std::endl; // 25
}

설명:

  • getLambda() 함수는 제곱을 계산하는 람다를 반환.

8. mutable 람다 (값 캡처 후 변경 가능)

람다에서 값 캡처를 했을 경우에도 내부에서 값을 변경하고 싶다면 mutable 키워드 필요.

int main() {
    int x = 10;
    auto lambda = [=]() mutable { x += 5; std::cout << x << std::endl; };
    lambda(); // 15
    std::cout << x << std::endl; // 10 (외부 변수에는 영향 없음)
}

설명:

  • mutable을 사용하면 캡처된 변수를 변경 가능하지만 외부 변수에는 영향을 주지 않음.

9. 람다의 타입 (auto 사용)

람다는 고유한 타입을 가짐. 따라서 auto를 이용해야 저장 가능.

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

📌 타입을 지정하려면 std::function 사용

std::function<int(int, int)> lambda = [](int a, int b) { return a + b; };

🔥 정리

C++ 람다 표현식은 간결하고 강력한 익명 함수
캡처 기능을 통해 외부 변수 활용 가능 ([=], [&], [x])
STL과 조합하여 강력한 활용 가능 (std::sort, std::function)
값 캡처 후 변경하려면 mutable 키워드 필요
반환 타입을 자동 추론 가능 (명시적 -> 지정 가능)

📌 C++11부터 도입, C++14, C++17에서 기능 확장됨! 🚀

반응형

'프로그래밍 > C,C++' 카테고리의 다른 글

[Modern C++] string_view  (0) 2025.04.02
[Modern C++20] 삼중 비교 연산자(Three-Way Comparison)  (0) 2025.03.28
[Modern C++] decltype  (0) 2025.03.25
[Modern C++] STL 자료구조  (0) 2025.03.24
[Modern C++] std::atomic  (1) 2025.03.21