1. C++의 람다식

C++에서도 람다식을 쓰면 익명함수를 사용할 수 있다. 다음은 C++에서 람다식을 사용한 한 예이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
int main()
{
    int num1 = 3, num2 = 5, num3 = 15;

    std::function<int(int, int)> func1 = [num1, &num2](int param1, int param2) ->int
    {
        num2 = 3;
        return param1*num1 + param2*num2;
    };

    std::cout << func1(1, 2) << '\n';
    std::cout << num1 << '\n';
    std::cout << num2;
 
    return 0;
}

1) std::function<int(int, int)> func1

- function<type1(type2, type3, …)>은 함수, 함수객체, 람다식을 담을 수 있는 변수형이다. 이를 이용하여 람다식을 변수에 담을 수 있다. <> 안의 맨앞 타입은 함수값의 반환형을 뜻하며, <> 안의 괄호 안 타입들은 함수가 받는 파라미터들의 타입을 뜻한다.

- 람다식 또한 함수로서 주소값을 가지므로, 함수포인터형으로 선언할 수 있다. 즉 int(*func1)(int, int) 구문으로 대체 가능하다.

- 간단하게 auto로 대체 가능하다.

2) [num1, &num2]

- [] 구문은 외부 변수 중 람다식 내부에서도 사용할 변수를 적는 부분이다. 위 코드와 같이 쓸 경우 람다식 내에서 num3는 사용하지 못한다.

- &num2와 같이 변수명 앞에 &를 쓰면 람다식 내에서 그 변수값을 변경하는 것이 람다식 호출 이후 람다식 외부에 반영된다. 즉 위 코드의 경우 std::cout « num2;에서 출력되는 num2의 값은 3이 된다.

- 보통 함수와 마찬가지로 전역변수의 경우에는 [] 구문 안에 적지 않아도 람다식 내에서 사용할 수 있다.

- [] 안 구문을 다음과 같이 쓰는 경우가 허용된다.

  설명
[] 이와 같이 [] 구문 안에 아무 것도 쓰지 않는 것도 허용된다. 이 경우 람다식 밖 어떤 변수도 람다식 내에서 사용할 수 없다. 단, 전역변수는 람다식 내에서 사용할 수 있다.
[=] 이처럼 [] 구문 안에 =를 쓰는 경우에는 람다식 외부의 모든 변수를 람다식 내에서 사용할 것임을 뜻한다. 단, 이 경우 람다식 내에서 그 값을 변경한다 하더라도 람다식 외부에 그 변경이 반영되지는 않는다.
[&] 이처럼 [] 구문 안에 &를 쓰는 경우에는 람다식 외부의 모든 변수를 람다식 내에서 사용하며 람다식 내에서 그 값을 변경할 경우 람다식 외부에 그것이 반영되게 할 것임을 뜻한다.
[=, &num1] 이처럼 = 뒤에 쉼표(,)로 변수명에 &를 붙여 이어 쓰는 경우에는, 모든 변수를 람다식 내에서 사용하되 &를 붙인 변수의 경우에만 그 변경이 람다식 외부에 반영되게 할 것임을 뜻한다.

- 람다식을 쓰기 위해서는 []를 반드시 써야 하며, 이를 생략하면 람다식으로 인식되지 않는다.

3) (int param1, int param2)

- 람다식의 파라미터를 받기 위한 구문이다. 람다식이 굳이 파라미터를 필요로 하지 않는다면 생략해도 된다.

4) ->int

- 람다식이 호출됐을 때 리턴할 함수값의 변수형을 -> 뒤에 적는다. 생략해도 무방하다.

5) { … };

- 람다식의 본문은 보통의 함수와 마찬가지로 {} 안에 들어가게 된다.

- 람다식을 void 형으로 사용하는 경우라면 {} 안에 return 구문은 없어도 된다. 그러나 리턴값이 있는 함수로 사용하고자 한다면 return 구문을 생략할 수 있는 경우는 없다.

2. 람다식의 사용 사례

1
2
3
4
5
6
7
    auto func1 = [](int param1, auto printNumber)
    {
        printNumber(param1 * param1);
    };

    for (int i=1; i<=10; i++)
        func1(i, [](int answer){std::cout<<answer<<' ';});

위 코드의 경우 콘솔에 1부터 100까지 제곱수가 차례대로 출력된다.

1
2
3
4
5
6
    int num1 = 5;

    [num1]
    {
        std::cout << num1;
    }();

위 코드의 경우 콘솔에 5가 출력된다.