(Cโบโบ) ๐Ÿค“Lambda

๋‚˜๋„ ์ด์ œ ๋ชจ๋˜์–ธ์–ด๋ผ๊ณ . ์ข€ ๋” ๋ณต์žกํ•˜์ง€๋งŒ(..)

1 minute read

๋ฒˆ์—ญํ•˜๊ธธ ์ต๋ช…ํ•จ์ˆ˜์ด๋‹ค. functor์ฒ˜๋Ÿผ ๊ฐ„๋‹จํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉด์„œ๋„ ํด๋ž˜์Šค๋ฅผ ์„ ์–ธํ•˜์ง€ ์•Š์•„๋„ ๋˜๋Š” ํŽธ๋ฆฌํ•œ ๊ธฐ๋Šฅ์ด๋‹ค. ๊ฐ€๋…์„ฑ์„ ํ•ด์นœ๋‹ค๋Š” ๊ฒฌํ•ด๋„ ์žˆ์ง€๋งŒ(๋‚˜๋„ ๊ทธ๋žฌ์ง€๋งŒ), ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ํ™”์‚ดํ‘œ ํ•จ์ˆ˜๋ฅผ ์“ฐ๋‹ค๋ณด๋‹ˆ ์ด์ •๋„๋Š” ์ข‹์•„๋ณด์ธ๋‹ค.

#include <iostream>  
#include <algorithm>  
using namespace std;  
  
int main()  
{  
	int v1 = 2;  
	int v2 = 3;  
	int v3 = 4;  
	//auto f1 = [](int n) { return n + v1 + v2; };   
	auto f2 = [v1, v2](int n) { return n + v1 + v2; };  
	auto f3 = [=](int n) { return n + v1 + v2 + v3; };  
  
	//auto f4 = [v1](int n) { return v1 = n; };   
	auto f5 = [&v1](int n) { return v1 = n; };   
	auto f6 = [&](int n) { return v1 = n; v2 = n; };   
	return 0;  
}  

์œ„ ์ฒ˜๋Ÿผ ๊ฐ„๋‹จํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋‚˜, ์ฃผ์˜ํ•  ์  ๊ทธ๋ฆฌ๊ณ  ํš๊ธฐ์ ์ธ ์ ์€ Capture์ด๋‹ค. ์ฒจ์ž([ ]) ์•ˆ์— ์™ธ๋ถ€์˜ context(๋ณ€์ˆ˜๋‚˜ this ๋“ฑ)๋ฅผ ๋„ฃ์œผ๋ฉด lambda ๋‚ด์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด๋‹ค. ์ „๋‹ฌํ•˜๋Š” ๋ฐฉ์‹์€ ๋ณต์‚ฌ ํ˜น์€ ์ฐธ์กฐ๊ฐ€ ๋ชจ๋‘ ๊ฐ€๋Šฅํ•˜๋‹ค. ์ด๋Š” ๋‹ค๋ฅธ ์–ธ์–ด์—์„œ๋„ ์ œ๊ณตํ•˜๋Š” closure์˜ ๊ฐœ๋…์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ง์ ‘ ๊ตฌํ˜„ํ•ด๋ณธ๋‹ค๋ฉด ์•„๋ž˜์™€ ๊ฐ™์€ ํด๋ž˜์Šค์˜ ํ˜•ํƒœ๊ฐ€ ๋  ์ˆ˜ ์žˆ๋‹ค.

class closure_object  
{  
	private: const int value1, value2;  
	public:  
		closure_object(int n1, int n2) : value1(n1), value2(n2) {}  
		int operator()(int n) const { return n + value1 + value2; }  
};  
  
int main()  
{  
	int v1 = 1, v2 = 2;  
	auto f1 = [v1, v2](int n) { return n + v1 + v2; };  
	cout << f1(10) << endl;  
  
	auto f2 = closure_object(v1, v2);    // [v1, v2](int n) { n + v1 + v2 }์™€ ๋™์ผ  
	cout << f2(10) << endl;    // ๊ฐ‘์ž๊ธฐ ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด ๋˜์–ด๋ฒ„๋ ธ๋‹ค  
	return 0;  
}  

๋‹ค๋งŒ lambda์˜ ๋‹จ์ ์„ ๊ผฝ์ž๋ฉด,

int main()  
{  
	auto f1 = [](int a, int b) { return a + b; };  
	auto f2 = [](int a, int b) { return a + b; };  
	cout << typeid(f1).name() << endl;  
	cout << typeid(f2).name() << endl;  
	return 0;  
}  

์œ„ ์˜ˆ์ œ์—์„œ f1, f2๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ํƒ€์ž…์ด๋ฉฐ, ์œ„ ๊ตฌํ˜„์ฒ˜๋Ÿผ ์ผ์ข…์˜ ๋‹ค๋ฅธ ํด๋ž˜์Šค๊ฐ€ ๋œ๋‹ค. ๋”ฐ๋ผ์„œ ๊ฐ™์€ ๊ธฐ๋Šฅ์ž„์—๋„ ๋ณ„๋„์˜ ๊ธฐ๊ณ„์–ด ์ฝ”๋“œ๋ฅผ ๊ฐ€์ง€๋ฉฐ code size๊ฐ€ ๋Š˜์–ด๋‚  ์ˆ˜ ์žˆ๋‹ค.