본문 바로가기
프로그래밍 언어/C++

C++ 람다함수 기본편

by Jo_Wick 2025. 10. 31.
반응형

C++에서 람다(lambda)익명 함수(anonymous function) 라고 한다.
즉, 이름이 없는, 짧은 함수를 코드 안에서 바로 정의해서 바로 쓰는 것이다.

 

보통 우리가 함수를 만들 땐 이렇게 한다

bool compare(int a, int b) {
    return a < b;
}

 

이건 “이름이 있는 함수(compare)”이다.


그런데 람다는 이름을 붙이지 않고 코드 안에서 즉석으로 만드는 함수이다.

[](int a, int b) {
    return a < b;
}

 

이게 람다 함수(lambda function)
함수 이름이 없고, 대괄호 []로 시작한다는 게 특징이다.

 


람다 기본 문법

[capture](parameters) -> return_type {
    // 함수 내용
}

 

  • 대부분의 경우 리턴 타입은 자동 추론돼서 생략 가능하다.
  • 타입이 복잡해서 auto나 템플릿으로 받는 게 일반적

 

[](int a, int b) {
    return a < b;
}

 

보통 이렇게 많이 쓴다.

 


[ ] — 캡처(capture)의 의미

람다 문법의 맨 앞 [] 안에는 외부 변수를 가져올 수 있다.

int pivot = 10;
auto cmp = [pivot](int a, int b) {
    return abs(a - pivot) < abs(b - pivot);
};

 

이렇게 하면 pivot 변수(= 외부 변수)를 람다 안에서 사용할 수 있다.
이걸 캡처(capture) 라고 한다.

예시

int pivot = 5;
vector<int> v = {1, 9, 3, 8};

sort(v.begin(), v.end(), [pivot](int a, int b) {
    return abs(a - pivot) < abs(b - pivot);
});

 

→ pivot(=5)에 더 가까운 순서로 정렬됨.

 


형태 의미
[ ] 외부 변수 캡처 안 함
[x] 변수 x를 복사해서 사용
[&x] 변수 x를 참조(원본 변경 가능)
[=] 외부 변수를 모두 복사
[&] 외부 변수를 모두 참조

 

[=] : 값으로 캡처 (Value Capture)

int x = 10;
auto f = [=]() { cout << x; }; // 값으로 복사
x = 20;
f(); // 여전히 10 출력

 

 

  • 외부 변수 x의 값을 복사해서 람다 안에 저장
  • 람다가 만들어진 시점의 값을 사용
  • 원본 x를 바꿔도 람다 안의 값은 그대로
  • 읽기 전용 (기본적으로 const)

특징

  • 안전함 (원본 변수를 바꾸지 않음)
  • 단점: 람다 생성 시 복사 비용이 있을 수 있음

 

[&] : 참조로 캡처 (Reference Capture)

int x = 10;
auto f = [&]() { cout << x; }; // 참조로 캡처
x = 20;
f(); // 20 출력

 

  • 외부 변수 x를 참조(원본 주소) 로 캡처
  • 람다 안에서 원본 변수에 접근함
  • 따라서 원본이 바뀌면 람다에서도 바뀜
  • 원본이 사라지면 Dangling Reference 위험 있음

특징

  • 실시간 값 반영
  • 위험: 외부 변수가 소멸되면 참조 깨짐

 

값을 참조하기 때문에 람다 안에서 값을 바꾸면 바뀐 값이 그대로 밖에서도 적용 된다.

#include <iostream>
using namespace std;

int main() {
    int x = 10;

    auto f = [&]() {
        x = 20;
        cout << "람다 안 x: " << x << endl; // 람다 안 x: 20
    };

    f();
    cout << "람다 밖 x: " << x << endl; // 람다 안 x: 20
}

 

 

주의할 점

  • [&]로 캡처했는데 람다가 원본 변수보다 오래 살면 위험
    → dangling reference (죽은 참조)
  • 예를 들어, 지역 변수 참조를 들고 다른 스레드에서 쓰면 crash 날 수 있음
  • 즉, “참조로 캡처한 람다”는 수명 관리에 신경 써야 함

 

부분 캡처 (혼합 사용)

int a = 1, b = 2, c = 3;

auto f = [=, &b]() {
    // a와 c는 값으로, b는 참조로 캡처
    cout << a << ' ' << b << ' ' << c;
};

 

 

  • [=, &b] → 전체는 값 캡처인데, b만 참조로 예외 처리
  • [&, a] → 전체는 참조 캡처인데, a만 값으로 예외 처리

 

캡처 안 한 변수는 접근 불가

int x = 10;
auto f = []() { cout << x; }; // 오류: x 캡처 안 함

 

 

 

  • [ ] 안에 아무것도 없으면 외부 변수 접근 불가
  • C++은 명시적으로 캡처해야만 외부 변수를 쓸 수 있음

 

심화편에서 계속...

 

반응형

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

C++ mutable  (0) 2025.11.03
C++ 람다함수 심화편  (0) 2025.11.03
C++ struct와 class의 차이  (0) 2025.10.04
C++ string compare 사용법  (0) 2025.10.01
C++ string 주요 멤버 함수  (0) 2025.10.01

댓글