C++의 람다식
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가 출력된다.