Lambda 란 무엇인가

Vong Sik Kong
Vong Sik KongSenior Network Programmer um IUGO Mobile Entertainment
lambda 란 무엇인가?
공봉식
람다란 Expression 과 Statements 를 갖는 이름 없는 함수
람다는 First-class object
람다는 Higher-order Function
람다는 Closure
void outer_function()
{
// 이름 없는 함수! 람다!
[](){}();
}
람다란 Expression 과 Statements 를 갖는 이름 없는 함수
람다는 First-class object
First-class object 란?
- 변수와 자료구조에 저장하고 사용할 수 있다.
- 함수의 입력 값으로 사용할 수 있다.
- 함수의 반환 값으로 사용할 수 있다.
- 실행 시간에 생성할 수 있다.
int main() {
string text = "C++0x Lambda!";
// 1. "코드 조각" 변수에 대입하기
function<void()> lambda = [=]()
{
cout << text << endl;
};
// 2. "코드 조각"을 자료구조에 저장하기
vector< function<void()> > container;
{
container.push_back( lambda );
container.push_back( [=](){ cout << text << endl; } );
};
// 3. "코드 조각"을 함수의 입력 파라미터로 사용하기
for_each( container.begin(), container.end(), [](const function<void()>& f){ f(); } );
return 0;
}
람다는 Higher-order Function
Higher-order Function 란?
함수의 입력 값으로 함수를 전달 받거나 함수의 결과 값
으로 함수를 반환할 수 있는 함수
int main()
{
// 1. 람다 함수를 반환 값으로 한다.
auto g = [](int x) -> function<int (int)>
{
return [=](int y) { return x + y; };
};
// 2. 람다 함수를 입력 값으로 받는다.
auto h = [](const function<int (int)>& f, int z)
{
return f(z) + 1;
};
auto a = h( g(7), 8 );
cout << a << endl;
}
람다는 Closure
Closure 란?
함수를 호출한 상위 코드 블록의 변수들이 호출된 함수
와 묶인 것을 뜻합니다.
즉 호출된 함수는 상위 코드 블록 의 외부 변수와 묶여
자기만의 상태를 갖게 되는 것입니다.
void capture()
{
int a = 0;
int b = 1;
int c = 2;
// 1. default 값 복사 캡처. 상위 코드 블록의 지역 변수 모두 값 복사 가능
[=](){ cout << a << “ “ << b << endl; }(); // 0 1 출력
// 2. default 값 참조 캡처. 상위 코드 블록의 지역 변수 모두 값 참조 가능
[&](){ cout << a << “ “ << b++ << endl;}(); // 0 1 출력
// 3. default 값 복사 캡처, b와 c 참조 캡처
[=, &b, &c](){ cout << a << “ “ << b << “ ” << c << endl; }(); // 0 2 2 출력
}
람다의 표현법
lambda-expression
: lambda-introducer lambda-parameter-
declarationopt compound-statement
lambda-introducer
: [ lambda-captureopt ]
lambda-capture
: capture-default
| capture-list
| capture-default , capture-list
capture-default
: &
| =
capture-list
: capture
| capture-list , capture
capture
: identifier
| & identifier
| this
lambda-parameter-declaration
: ( lambda-parameter-declaration-listopt ) mutable-
specificationopt exception-specificationopt lambda-
return-type-clauseopt
lambda-parameter-declaration-list
: lambda-parameter
| lambda-parameter , lambda-parameter-
declaration-list
lambda-parameter
: decl-specifier-seq declarator
lambda-return-type-clause
: -> type-id
lambda-introducer (referred to as capture clause later in this topic)
lambda-parameter-declaration-list (referred to as parameter list later in this topic)
mutable-specification (referred to as mutable specification later in this topic)
exception-specification (referred to as exception specification later in this topic)
lambda-return-type-clause (referred to as return type later in this topic)
compound-statement (referred to as lambda body later in this topic)
예를 들어보자
and
[this] 람다가 클래스 안에서 선언될 때 this 를 가져온다. [&], [=] 모두
자동으로 this 를 가져온다.
mutable 은 머냐?
람다 캡쳐에서 값으로 복사한 변수의 값을 변경시킬 수 있다.
int x = 10;
// mutable 을 선언하지 않으면 x 의 값을 변경시킬 수 없다.
[=] () mutable { x = 20; };
// 하지만 x 는 여전히 10
cout << x << endl;
값 복사시 const 속성을 잃는다.
const int M = 10;
int x[M]; // OK
[=] () {
int y[M]; // !Error
int* z = new int[M]; // OK
};
언제 써먹나?
1. fuctor 보다 편하다.
- functor 만들기 귀찮아서 안쓰던 for_each 같은 함수들 쓰기 좋아진다
2. fuction 을 벡터나 큐에 넣어서 Async 하게 호출 할 때 쓴다
3. Call 하는 쪽에서 함수의 Context 를 정의할 수 있다.
4. Async 콜의 경우 함수가 뚝뚝 떨어져서 가독성을 떨어트리는데, 한곳에
기능을 적을 수 있다.
4번에 대한 추가 설명
기존 방식
void Request()
{
Async_test1();
}
void Async_test1()
{
// 할 일 들..
Async_test2();
}
void Async_test2()
{
// 할일 들2
}
람다를 쓸 경우
void Request()
{
Async_call([]() {
// 할 일들
Async_call([](){
// 할 일들 2
});
});
}
함수 동작이 한 눈에 보인다
Reference
http://www.softwarequalityconnection.com/2011/06/the-biggest-changes-in-c11-and-why-you-should-care/
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2009/n2859.pdf
http://www2.research.att.com/~bs/C++0xFAQ.html#lambda
http://msdn.microsoft.com/en-us/library/dd293603.aspx
http://www2.fz-juelich.de/jsc/docs/vendordocs/cce/doc/main_cls/cref_cls/common/cppref_lambda_lambdacapt.htm
http://vsts2010.net/310
1 von 17

Más contenido relacionado

Was ist angesagt?(20)

자바8 람다 나머지 공개자바8 람다 나머지 공개
자바8 람다 나머지 공개
Sungchul Park9.3K views
자바8 스트림 API 소개자바8 스트림 API 소개
자바8 스트림 API 소개
beom kyun choi49.3K views
자바8강의 2강. Stream API자바8강의 2강. Stream API
자바8강의 2강. Stream API
Sejong Park1.8K views
JDK 변천사JDK 변천사
JDK 변천사
SeungHyun Eom12.9K views
자바스크립트 함수자바스크립트 함수
자바스크립트 함수
유진 변3.4K views
5 swift 기초함수5 swift 기초함수
5 swift 기초함수
Changwon National University367 views
Javascript 교육자료 pdfJavascript 교육자료 pdf
Javascript 교육자료 pdf
Hyosang Hong4.7K views
Java lambdaJava lambda
Java lambda
Hyosang Hong96 views
Javascript 완벽 가이드 정리Javascript 완벽 가이드 정리
Javascript 완벽 가이드 정리
ETRIBE_STG2.1K views
6 swift 고급함수6 swift 고급함수
6 swift 고급함수
Changwon National University500 views
Start IoT with JavaScript - 6.함수Start IoT with JavaScript - 6.함수
Start IoT with JavaScript - 6.함수
Park Jonggun728 views
Just javaJust java
Just java
Jong Wook Kim1.4K views
Start IoT with JavaScript - 1.기초Start IoT with JavaScript - 1.기초
Start IoT with JavaScript - 1.기초
Park Jonggun3.5K views
일단 시작하는 코틀린일단 시작하는 코틀린
일단 시작하는 코틀린
Park JoongSoo18.8K views
JavascriptJavascript
Javascript
Hong Hyo Sang82 views

Destacado(20)

3-1. css3-1. css
3-1. css
JinKyoungHeo1.8K views
AWS Lambda를 이용한 CI/CD 기법AWS Lambda를 이용한 CI/CD 기법
AWS Lambda를 이용한 CI/CD 기법
Jesang Yoon2.5K views
Programming paradigmProgramming paradigm
Programming paradigm
Bhavin Kamani1.3K views
[ASomeCloud] AWS 서비스소개[ASomeCloud] AWS 서비스소개
[ASomeCloud] AWS 서비스소개
ASome Cloud748 views
RxJava in ActionRxJava in Action
RxJava in Action
Taeho Kim2K views

Similar a Lambda 란 무엇인가(20)

Más de Vong Sik Kong

UPnP 발표자료UPnP 발표자료
UPnP 발표자료Vong Sik Kong
5.4K views28 Folien
Hadoop발표자료Hadoop발표자료
Hadoop발표자료Vong Sik Kong
5.8K views72 Folien
Chap10Chap10
Chap10Vong Sik Kong
804 views60 Folien

Más de Vong Sik Kong(8)

UPnP 발표자료UPnP 발표자료
UPnP 발표자료
Vong Sik Kong5.4K views
TDD in gameserver 발표자료TDD in gameserver 발표자료
TDD in gameserver 발표자료
Vong Sik Kong741 views
Hadoop발표자료Hadoop발표자료
Hadoop발표자료
Vong Sik Kong5.8K views
HolubOnPatterns/chapter3_2HolubOnPatterns/chapter3_2
HolubOnPatterns/chapter3_2
Vong Sik Kong540 views
Chap10Chap10
Chap10
Vong Sik Kong804 views
게임 서버 기술 현황 및 전망게임 서버 기술 현황 및 전망
게임 서버 기술 현황 및 전망
Vong Sik Kong1.2K views
6장 그래프 알고리즘6장 그래프 알고리즘
6장 그래프 알고리즘
Vong Sik Kong3.4K views

Lambda 란 무엇인가

  • 2. 람다란 Expression 과 Statements 를 갖는 이름 없는 함수 람다는 First-class object 람다는 Higher-order Function 람다는 Closure
  • 3. void outer_function() { // 이름 없는 함수! 람다! [](){}(); } 람다란 Expression 과 Statements 를 갖는 이름 없는 함수
  • 4. 람다는 First-class object First-class object 란? - 변수와 자료구조에 저장하고 사용할 수 있다. - 함수의 입력 값으로 사용할 수 있다. - 함수의 반환 값으로 사용할 수 있다. - 실행 시간에 생성할 수 있다.
  • 5. int main() { string text = "C++0x Lambda!"; // 1. "코드 조각" 변수에 대입하기 function<void()> lambda = [=]() { cout << text << endl; }; // 2. "코드 조각"을 자료구조에 저장하기 vector< function<void()> > container; { container.push_back( lambda ); container.push_back( [=](){ cout << text << endl; } ); }; // 3. "코드 조각"을 함수의 입력 파라미터로 사용하기 for_each( container.begin(), container.end(), [](const function<void()>& f){ f(); } ); return 0; }
  • 6. 람다는 Higher-order Function Higher-order Function 란? 함수의 입력 값으로 함수를 전달 받거나 함수의 결과 값 으로 함수를 반환할 수 있는 함수
  • 7. int main() { // 1. 람다 함수를 반환 값으로 한다. auto g = [](int x) -> function<int (int)> { return [=](int y) { return x + y; }; }; // 2. 람다 함수를 입력 값으로 받는다. auto h = [](const function<int (int)>& f, int z) { return f(z) + 1; }; auto a = h( g(7), 8 ); cout << a << endl; }
  • 8. 람다는 Closure Closure 란? 함수를 호출한 상위 코드 블록의 변수들이 호출된 함수 와 묶인 것을 뜻합니다. 즉 호출된 함수는 상위 코드 블록 의 외부 변수와 묶여 자기만의 상태를 갖게 되는 것입니다.
  • 9. void capture() { int a = 0; int b = 1; int c = 2; // 1. default 값 복사 캡처. 상위 코드 블록의 지역 변수 모두 값 복사 가능 [=](){ cout << a << “ “ << b << endl; }(); // 0 1 출력 // 2. default 값 참조 캡처. 상위 코드 블록의 지역 변수 모두 값 참조 가능 [&](){ cout << a << “ “ << b++ << endl;}(); // 0 1 출력 // 3. default 값 복사 캡처, b와 c 참조 캡처 [=, &b, &c](){ cout << a << “ “ << b << “ ” << c << endl; }(); // 0 2 2 출력 }
  • 10. 람다의 표현법 lambda-expression : lambda-introducer lambda-parameter- declarationopt compound-statement lambda-introducer : [ lambda-captureopt ] lambda-capture : capture-default | capture-list | capture-default , capture-list capture-default : & | = capture-list : capture | capture-list , capture capture : identifier | & identifier | this lambda-parameter-declaration : ( lambda-parameter-declaration-listopt ) mutable- specificationopt exception-specificationopt lambda- return-type-clauseopt lambda-parameter-declaration-list : lambda-parameter | lambda-parameter , lambda-parameter- declaration-list lambda-parameter : decl-specifier-seq declarator lambda-return-type-clause : -> type-id
  • 11. lambda-introducer (referred to as capture clause later in this topic) lambda-parameter-declaration-list (referred to as parameter list later in this topic) mutable-specification (referred to as mutable specification later in this topic) exception-specification (referred to as exception specification later in this topic) lambda-return-type-clause (referred to as return type later in this topic) compound-statement (referred to as lambda body later in this topic) 예를 들어보자
  • 12. and [this] 람다가 클래스 안에서 선언될 때 this 를 가져온다. [&], [=] 모두 자동으로 this 를 가져온다.
  • 13. mutable 은 머냐? 람다 캡쳐에서 값으로 복사한 변수의 값을 변경시킬 수 있다. int x = 10; // mutable 을 선언하지 않으면 x 의 값을 변경시킬 수 없다. [=] () mutable { x = 20; }; // 하지만 x 는 여전히 10 cout << x << endl;
  • 14. 값 복사시 const 속성을 잃는다. const int M = 10; int x[M]; // OK [=] () { int y[M]; // !Error int* z = new int[M]; // OK };
  • 15. 언제 써먹나? 1. fuctor 보다 편하다. - functor 만들기 귀찮아서 안쓰던 for_each 같은 함수들 쓰기 좋아진다 2. fuction 을 벡터나 큐에 넣어서 Async 하게 호출 할 때 쓴다 3. Call 하는 쪽에서 함수의 Context 를 정의할 수 있다. 4. Async 콜의 경우 함수가 뚝뚝 떨어져서 가독성을 떨어트리는데, 한곳에 기능을 적을 수 있다.
  • 16. 4번에 대한 추가 설명 기존 방식 void Request() { Async_test1(); } void Async_test1() { // 할 일 들.. Async_test2(); } void Async_test2() { // 할일 들2 } 람다를 쓸 경우 void Request() { Async_call([]() { // 할 일들 Async_call([](){ // 할 일들 2 }); }); } 함수 동작이 한 눈에 보인다