C++ 람다식 기초 사용

C++11부터 도입된 람다식(Lambda Expression)은 함수를 별도로 선언하지 않고 코드 중간에 즉석에서 정의하여 사용할 수 있는 익명 함수다.

코드를 간결하게 만들고 로직의 집중도를 높이는 데 효과적이다.

람다식의 기본 구조

람다식은 [캡처](매개변수) -> 반환타입 { 본문 } 형식을 가진다.

반환 타입은 생략 가능하다.

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

int main() {
    // 1. 가장 단순한 형태의 람다
    auto hello = []() { std::cout << "Hello, Lambda!" << std::endl; };
    hello();

    // 2. 매개변수와 반환값이 있는 람다
    auto add = [](int a, int b) -> int {
        return a + b;
    };
    std::cout << "Sum: " << add(10, 20) << std::endl;

    return 0;
}

캡처 절 (Capture Clause)

람다식 외부의 변수를 내부에서 사용하기 위한 규칙이다.

  • [=]: 모든 외부 변수를 값으로 복사하여 캡처한다.
    (읽기 전용)
  • [&]: 모든 외부 변수를 참조로 캡처한다.
    (수정 가능)
  • [x, &y]: x는 값으로, y는 참조로 개별 지정하여 캡처한다.
int factor = 2;
std::vector<int> nums = {1, 2, 3, 4, 5};

// factor를 값으로 캡처하여 사용
std::for_each(nums.begin(), nums.end(), [factor](int& n) {
    n *= factor;
});

STL 알고리즘과의 결합

람다식은 std::sortstd::find_if 같은 알고리즘 함수와 함께 사용될 때 강력한 위력을 발휘한다.

struct Student {
    std::string name;
    int score;
};

std::vector<Student> students = { {"Kim", 80}, {"Lee", 95}, {"Park", 85} };

// 점수 기준 내림차순 정렬 (람다 사용)
std::sort(students.begin(), students.end(), [](const Student& a, const Student& b) {
    return a.score > b.score;
});

// 90점 이상인 첫 번째 학생 찾기
auto it = std::find_if(students.begin(), students.end(), [](const Student& s) {
    return s.score >= 90;
});

P.S

람다식은 일회성으로 사용되는 함수 객체를 생성하는 번거로움을 줄여준다.

함수를 데이터처럼 주고받는 현대적 프로그래밍 스타일을 C++에서 구현하기 위한 필수 문법인 것 같다.

Author avatar

웨이호프

WordPress creator and blogger.

View all posts