Shong Studio의 정보 창고

C++ 람다식 다뤄보기 본문

프로그래밍 언어

C++ 람다식 다뤄보기

Shong Studio 2024. 5. 29. 01:08
728x90
반응형

C++에서 람다식(Lambda Expression)은 익명 함수 객체를 표현하기 위해 사용됩니다.
주로 간단한 함수 정의를 할 때 유용하며, 함수 포인터나 함수 객체로 전달할 수 있습니다.

람다식의 기본 구문은 다음과 같습니다:

[capture](parameters) -> return_type { body }

각 부분을 설명하겠습니다:

  1. 캡처 목록 ([]):

    • 람다 함수가 정의된 위치의 변수들을 어떻게 캡처할지 지정합니다.
    • []: 아무것도 캡처하지 않음.
    • [&]: 모든 외부 변수를 참조로 캡처.
    • [=]: 모든 외부 변수를 값으로 캡처.
    • [x, &y]: x는 값으로, y는 참조로 캡처.
  2. 매개변수 목록 ((parameters)):

    • 람다 함수가 받을 매개변수를 정의합니다. 일반 함수와 동일하게 사용합니다.
  3. 리턴 타입 (-> return_type):

    • 람다 함수의 리턴 타입을 명시적으로 지정할 수 있습니다. 생략할 경우, 컴파일러가 본문을 통해 리턴 타입을 추론합니다.
  4. 본문 ({ body }):

    • 람다 함수의 실제 구현 부분입니다.

주어진 람다식 분석

주어진 코드에서의 람다식은 다음과 같습니다:

nc.addObserver("LOWBATTERY", [](void*) { std::cout << "lambda\n"; });

이 람다식을 분석해보겠습니다:

  1. 캡처 목록 ([]):

    • []는 이 람다식이 외부 범위의 어떤 변수도 캡처하지 않음을 의미합니다.
  2. 매개변수 목록 ((void*)):

    • 이 람다식은 void* 타입의 매개변수를 하나 받습니다. 이 매개변수를 통해 특정 데이터를 받을 수 있습니다.
  3. 리턴 타입:

    • 리턴 타입이 명시되어 있지 않으므로, 컴파일러가 자동으로 추론합니다. 이 경우, void 타입으로 추론됩니다.
  4. 본문 ({ std::cout << "lambda\n"; }):

    • 이 람다식의 본문은 단순히 "lambda\n" 문자열을 출력하는 코드입니다.

캡처 목록의 의미

캡처 목록은 람다 함수가 정의된 위치의 변수들에 접근하는 방법을 정의합니다. 몇 가지 예를 들어보겠습니다:

  • []: 외부 변수를 캡처하지 않음.
  • [&]: 모든 외부 변수를 참조로 캡처.
  • [=]: 모든 외부 변수를 값으로 캡처.
  • [x]: 변수 x를 값으로 캡처.
  • [&x]: 변수 x를 참조로 캡처.
  • [=, &y]: 모든 외부 변수를 값으로 캡처하지만, y는 참조로 캡처.

예제

외부 변수를 캡처하는 람다식 예제를 살펴보겠습니다:

int main() {
    int a = 10;
    int b = 20;

    auto lambda1 = [=]() { std::cout << "a: " << a << ", b: " << b << "\n"; };
    auto lambda2 = [&]() { a = 30; std::cout << "a: " << a << ", b: " << b << "\n"; };
    auto lambda3 = [a, &b]() { b = 40; std::cout << "a: " << a << ", b: " << b << "\n"; };

    lambda1(); // a: 10, b: 20
    lambda2(); // a: 30, b: 20
    lambda3(); // a: 10, b: 40

    return 0;
}
  • lambda1ab를 값으로 캡처합니다.
  • lambda2는 모든 외부 변수를 참조로 캡처합니다.
  • lambda3a를 값으로, b를 참조로 캡처합니다.

이렇게 캡처 목록을 통해 람다식이 외부 변수를 어떻게 캡처할지 명시적으로 정의할 수 있습니다.

요약

  • 캡처 목록 ([]): 람다 함수가 외부 변수를 어떻게 캡처할지 정의.
  • 매개변수 목록 ((void*)): 람다 함수의 매개변수.
  • 리턴 타입 (-> return_type): 람다 함수의 리턴 타입 (생략 가능).
  • 본문 ({ body }): 람다 함수의 실제 코드.

주어진 코드에서 []는 외부 변수를 캡처하지 않는다는 의미로 사용되었습니다. 이는 해당 람다식이 외부 변수를 필요로 하지 않음을 의미합니다.

728x90
반응형