ProgrammingLang/c++

[C++ 개발자되기] 4. lambda 사용법

jinkwon.kim 2019. 7. 19. 09:42
728x90
반응형

>>[C++ 관련 모든 글 보기]

 

1. lambda는 무엇인가??

  1) 정의

    - 이름 없는 함수입니다.

 

  2) 형태

    (1) 캡처

      - Lambda 외부에서 정의한 변수를 Lambda 코드 부분에서 에서 사용하기 위해 선언 부분입니다.

      - 선언 방법의 종류는 다음과 같습니다.

        a. 복사 캡처 [ = ] 

더보기

          - 모든 변수나 상수를 복사로 캡처하고 현재 lambda객체에서 사용, 

          - 전역(global) 범위까지가 그 캡처 범위입니다

        b. 참조 캡쳐 [ & ]

더보기

          - 모든 변수나 상수를 참조로 캡처하고 현재 lambda객체에서 사용

          - 전역(global) 범위까지가 그 캡처 범위입니다

        c. 현재 객체 캡쳐 [ this ]

더보기

         - 클래스 멤버 함수안에서 정의되는 lambda는 [this]로 현재 객체를 참조로 캡처할 수 있습니다.

        d. 아무것도 캡쳐 안 함 [ ]

      Ex) 참조 사이트 https://docs.microsoft.com/ko-kr/cpp/cpp/lambda-expressions-in-cpp?view=vs-2019

더보기

        a. 정상 사용

          [&total, factor]

          [factor, &total]

          [&, factor]

          [factor, &]

          [=, &total] [&total, =]

       b. 잘 못된 사용 법

          [&, &i]{};   // ERROR: i preceded by & when & is the default

          [=, this]{};  // ERROR: this when = is the default

          [i, i]{};       // ERROR: i repeated

    (2) 매개 변수

      - 일반 함수의 매개 변수 

    (3) 리터 타입

      - 일반 함수의 return type

    (4) 코드

      - 실행할 코드

    (5) 인자

      - lamdba 함수에서 전달할 인자

 

  2) 사용법

    (1) 매개 변수가 없을 때

      []{};  or  [](){};

    (2) 매개 변수가 있을 때

      [](int a){}:

    (3) 매개 변수가 있고 리턴 값이 있을 때

      [](int a)->int { return a; }:

    (4) 즉시 실행 방법

      - Lambda함수 생성 후 마지막에 ()를 사용하여 호출합니다.

      [](){}();

2. lambda의 특징

  1) 함수를 객체처럼 다룰 수 있습니다.

    - lambda를 std::function Class에 대입할 수 있기 때문에 이것을 함수의 입력, 반환 값으로 사용 가능합니다.

      * std::function은 C언어의 함수 포인터라고 생각하면 이해가 빠릅니다.

    (1) 함수의 입력 값 값으로 사용할 수 있습니다.

      std::function에 lambda함수를 담아 다름 함수의 인자로 넘길 수 있습니다.

    (2) 함수의 반환 값으로 사용할 수 있습니다.

      std::function에 lambda함수를 담아 함수의 반환 값으로 넘길 수 있습니다.

  2) 실행 시간에 생성할 수 있습니다.

3. Sampel Code

  1) lambda를 객체처럼 사용하는 예제

    (1) 함수의 입력 값 값으로 사용할 수 있습니다.

      - 다음 코드에서 lambda 함수를  myid란 객체에 담아 WhatIsYourId의 id의 인자로 사용하였습니다.

#include <iostream>
#include <functional>

using namespace std;

void WhatIsYourId(function<string ()> id) {
        cout<<"MY Id is "<< id();
}

int main() {
        function<string ()> myid = [](){
                return "chun4foryhou";
        };

        WhatIsYourId(myid);
        return 0;
}

    (2) 함수의 반환 값으로 사용할 수 있습니다.

      - 다음 코드에서 중요한 것은 GetLambdaFunc의 return 이 Lambda 함수라는 것이 중요합니다.

#include <iostream>
#include <functional>

using namespace std;

function<void ()> GetLambdaFunc(int cmd) {
        switch (cmd) {
                case 1:
                        return [](){
                                cout<<"Cmd 1"<<endl;
                        };
                        break;
                case 2:
                        return [](){
                                cout<<"Cmd 2"<<endl;
                        };
                        break;
        }
}

int main() {

        function<void ()> getlambda;

        getlambda = GetLambdaFunc(2);
        getlambda();
        return 0;
}

 

  2) 실행 시간에 함수를 생성하여 바로 사용하는 예제

#include <iostream>

int main() {
	int a = 1;
    int b = 2;
    
   	std::cout<<[a, &b](int c, int d)->int {
    	return a+b+c+d;
    } (3, 4)<<std::cout;
	return 0;
}

 

4. lambda의 mutable 이란 ?

[캡처절] (매개변수) mutable -> 반환형식 { 함수내용 }

    1. [캡쳐절]은 외부 변수를 가져다 쓸 수 있는 공간이고,

    2. (매개변수)는 말 그대로 함수 선언시 필요한 매개 변수이다.

    3. mutable 은 함수 내에서 외부 변수를 수정할 수 있게 해 주는 옵션

    4. 반환형식 : 함수 리턴 형식 

    5. {함수 내용} 

 

5. lambda는 언제 쓰면 좋은 것일까?

  아직 까지는 C++어린이라 잘 모르겠다.. 누가 뎃글좀.. 

>>[C++ 관련 모든 글 보기]

728x90
반응형