SlideShare a Scribd company logo
1 of 39
DevRookie
C++ Lambda
2020.06.20
By TonyChoiMS
함수 객체
Lambda
Capture
클로져 객체의 복사 생성자와 소멸자
람다의 전달 및 저장
Index
01
02
03
04
05
Functor 함수 객체
람다를 알기 전에 미리 알아두면 좋은 내용.
- 객체를 마치 함수처럼 사용하기에 붙여진 이름.(== Functor)
- 함수가 되기 위한 조건 중 하나는 괄호
(함수 호출 연산자,Function call operator)를 사용해 파라미터 목록을
받는 것.
- 어떤 객체를 함수처럼 사용한다는 것은 객체에 괄호를 붙여서 마치 겉
보기엔 함수를 호출하는 것처럼 사용한다는 의미.
- 컴파일러가 이해할 수 있도록 클래스 안에서 함수호출 연산자를
오버로딩 해줘야 한다.
함수 객체(Function Object)01
4
함수 객체(Function Object)01
5
- 함수객체를 사용하는 이유는 성능상에서 이점을 가져올 수 있습니다.
- STL을 이용할 때 인자로 함수를 받는 케이스들이 있습니다.
ex) std::for_each(), std::count_if()
- 이 때 인자로 함수 객체를 넘겨주게 되면, 그 바디가 인라인되어
성능에 상당한 이점을 가져갈 수 있습니다.
함수 객체(Function Object)01
6
C++ Lambda
Lambda Expression
- C++ 11에 추가된 개념
- 함수 객체 (Function Object)보다 쉽고 편하게 사용할 수 있는 표
기법.
- 익명 함수 객체를 정의하고 사용하는 표기법.
- Java, C# 등 타 언어에서도 많이 쓰이는 개념.
C++ Lambda02
8
- Lambda는 크게 4개의 부분으로 구성되어 있습니다.
1. 개시자(Introducer)
2. 인자(Parameters)
3. 반환 타입(Return Type)
4. 함수의 몸통(Statement)
C++ Lambda02
9
- 개시자(Introducer)
- 괄호 안에 어떤 외부 변수(my_mod)를 입력하게 되면 람다 함수
가 이를 캡쳐해서, 해당 변수를 람다 내부에서 이용할 수 있게 됩니
다.
C++ Lambda02
10
- 인자(Parameters)
람다가 실행 시 받을 인자를 입력.
- 반환 타입 (Return Type)
람다가 종료될 때 반환할 타입 선언
- 몸통 (statement)
람다에서 실행할 내용.
C++ Lambda02
11
- Closure == Closed over(Closure)
- 코드 상에 람다가 존재할 경우, 런타임 시 이름은 없지만,
메모리 상에 임시적으로 존재하는 Closure 객체가 생성됩니다.
- Closure 객체는 함수 객체 처럼 행동합니다.
- lazy evaluation (늦은 평가)이 가능합니다.
C++ Lambda02
12
C++ Lambda 예제
Lambda Example
- 어떤 벡터의 원소들의 모든 곱을 계산하는 코드를 작성해 볼 예정
입니다.
- 각각 iterator / Functor / Lambda를 이용해서 작성해 볼 예정입니
다.
C++ Lambda Practice03
14
- 첫번째로 작성 해볼 코드는 바로 Iterator만을 사용한 코드입니다.
C++ Lambda Practice03
15
- Functor를 이용해서 작성한
코드 예제 입니다.
- for_each를 사용해 이전 코
드의 while문을 모두 없앨 수
있습니다.
- 하지만 Functor를 구성하는
코드를 작성하기 위해 위에
struct를 생성, void operator()
정의하는 부분이 추가되었습
니다.
C++ Lambda Practice03
16
- Lambda를 이용해서 작성한 코드 예제 입니다.
- 짧고 간결하며, 깔끔하게 for_each문을 사용할 수 있게 되었
습니다.
C++ Lambda Practice03
17
- 람다식의 맨 뒤에 괄호()를 붙여서 바로 임시 클로져 객체를
실행시킬 수도 있습니다.
- 리턴 타입이 void일 경우 ‘->’ 를 생략할 수 있습니다.
- 받는 인자가 없을 경우, ()를 생략할 수 있습니다.
C++ Lambda Practice03
18
Capture
람다식 내부와 외부의 소통
- 람다 안에서 람다 밖에 있는 변수들에게 접근하고자 할 때, 인자로 해당
변수들을 받을 수 없는 상황에서 접근할 수 있는 방법을 제공합니다.
- 라이브러리를 사용하게 될 때 함수의 인자를 맞춰줘야 하는 상황이 생
기는데, 이 때 람다 내부와 외부가 ‘소통할 수 있게 하는 문’ 이라고 생각하
시면 될 것 같습니다.
Ex) C++ STL
- 캡쳐 하고자 하는 내용은 ‘[]’ 안에 적용하게 되는데, 대표적으로 4가지
의 형태를 지니고 있습니다.
Capture04
21
1. [&]() { /* */ }
- 외부의 모든 변수들을 레퍼런스로 가져온다.(함수의 Call-by-Reference)
2. [=]() { /* */ }
- 외부의 모든 변수들을 값으로 가져온다.(함수의 Call-by-value)
3. [=, &x, &y] { /* */ } , 혹은 [&, x, y] { /* */ } 외부의 모든 변수들을 값/레퍼런스로 가져
오되, x와 y만 레퍼런스/값으로 가져온다.
Capture04
22
Capture04
23
- 여기서 예제 코드와 같은 형식으로 작성했을 때, 캡쳐를 레퍼런스가 아닌 값으
로 했을 때 변수를 언제 캡쳐하게 될까요?
- 람다는 클로져 객체가 처음 생성될 때 변수들의 값을 캡쳐하게 됩니다.
- 캡쳐를 값으로 할 때 주의점은 그 변수들에는 자동으로 const 속성이 붙는다는
것입니다.
Capture04
24
위 예제에서는 cardinal에 있는 원소들을 for_each를 통해 순회하면서
total_elements에 곱하게 됩니다. 이 때 캡쳐는 & 이므로 외부 변수인
total_elements를 캡쳐 해서 수정할 수 있었습니다.
Capture04
25
캡쳐의 범위에 아무것도 입력하지 않게되면 기본 캡쳐 모드가 없기 때문에 외부
변수를 수정할 수 없습니다.
Capture04
27
- Call-by-Value 형식의 캡쳐를 사용하게 되면 이와 같은 컴파일 에러를 발생하
게 됩니다.
- 위 코드에서 total_elements는 값으로 전달 받았으므로 const인데, 값을 바꾸
려고 하니 에러가 발생한 것입니다.
- 그렇다면 함수 내부에서 값을 바꾸고자 하면 어떻게 해야할까요?
Capture04
28
- 답은 mutable 속성을 추가해주시면 됩니다.
- 람다 함수 외부의 지역변수인 i의 값은 변하지 않고, 오직 람다 함수 내부의 ‘ 어
떤 다른 i ’의 값이 변하는 것을 확인할 수 있습니다.
클로져 객체의 복사 생성자와 소멸자
객체의 생성과 복사
클로져 객체의 복사 생성자와 소멸자05
30
- 모든 클로져 객체들은 암묵적으로 복
사 생성자와 소멸자를 가지고 있습니다.
- 먼저 복사 하지 않는 상황에서 람다
를 사용하는 예제를 먼저 보겠습니다.
- f에서 t를 사용하지 않았으므로, t를
캡쳐하지 않게 됩니다.
클로져 객체의 복사 생성자와 소멸자05
31
- 먼저 m1를 생성하면서, 람다가 t를 캡쳐
했으므로 t의 복사 생성자가 호출되게 됩니
다. 왜냐면 캡쳐를 값으로 받았기 때문이죠.
- 아래의 auto m2 = m1; 에서 클로져 객
체의 복사 생성이 일어나는데, 이 때 클로
져 객체의 복사 생성자가 값으로 캡쳐된 객
체들을 똑같이 복사 생성해주게 됩니다.
클로져 객체의 복사 생성자와 소멸자05
32
- 위에 말씀드렸던 것처럼, 캡쳐를 레
퍼런스로 받게 되면 복사 생성자가 호
출되지 않게 됩니다.
람다의 전달 및 저장
람다식 내부와 외부의 소통
람다의 전달 및 저장06
34
- 람다의 전달 방식의 또다른 방법으로
는 함수 포인터를 이용하는 방법이 있
습니다.
- 이 경우에는 람다가 캡쳐하는 것이
없어야 합니다.
람다의 전달 및 저장06
35
- 람다 캡쳐하는 부분에 캡쳐
하는 방식을 전달하게 될 경우
적절한 변환 함수가 없다며 컴
파일 에러를 내게 됩니다.
람다의 전달 및 저장06
36
- C++ 11에서는 클로져 객체를 전달하고 또 저장할 수 있는 기능이 제공됩니다.
- 바로 std::function입니다. 스 어떤 클로져 객체나 함수 등을 모두 보관 할 수 있는 저장소 입니다.
- 참고로 Visual Studio 2010에서는 <functional> 을 include 시켜줘야합니다.
람다의 전달 및 저장06
37
- auto 키워드를 이용할 경우 변수를 정의할
때 해당 변수가 명확하게 구현되어야 컴파일
에서 타입을 추정할 수 있습니다.
- auto를 이용하게 되면, 처음 캡쳐 부분에서
캡쳐하는 대상의 타입이 명확히 정해지지 않
은 상태이므로 타입을 추정할 수 없게 됩니다.
람다의 전달 및 저장06
38
- std::function을 이용할 경우 f1을 먼저 선언
만 해놓은 뒤 f2를 구현하고, 다시 f1을 구현할
수 있게 됩니다.
람다의 전달 및 저장06
39
- std::function을 사용하면 람다 함수로 재귀 호출 함수도 구현할 수 있게 됩니다.
참고 자료07
40
- 초보자를 위한 C++ 200제 (2판)
- 씹어먹는 C++ 토막글 (https://modoocode.com/196)
- VallistA C++11 :: Lamda Expression
https://vallista.tistory.com/entry/C-11-Lambda-Expression-
%EB%9E%8C%EB%8B%A4-%ED%91%9C%ED%98%84%EC%8B%9D-
%ED%95%A8%EC%88%98-%EA%B0%9D%EC%B2%B4-Functor
- jacking75 https://jacking75.github.io/cpp_stl_function/
감사합니다

More Related Content

What's hot

리플렉션과 가비지 컬렉션
리플렉션과 가비지 컬렉션리플렉션과 가비지 컬렉션
리플렉션과 가비지 컬렉션QooJuice
 
NDC2017 언리얼엔진4 디버깅 101 - 게임 기획자, 프로그래머가 버그와 만났을 때 사용할 수 있는 지침들
NDC2017 언리얼엔진4 디버깅 101 - 게임 기획자, 프로그래머가 버그와 만났을 때 사용할 수 있는 지침들NDC2017 언리얼엔진4 디버깅 101 - 게임 기획자, 프로그래머가 버그와 만났을 때 사용할 수 있는 지침들
NDC2017 언리얼엔진4 디버깅 101 - 게임 기획자, 프로그래머가 버그와 만났을 때 사용할 수 있는 지침들영욱 오
 
Umg ,이벤트 바인딩, Invaidation Box
Umg ,이벤트 바인딩, Invaidation BoxUmg ,이벤트 바인딩, Invaidation Box
Umg ,이벤트 바인딩, Invaidation Box대영 노
 
Unreal animation system
Unreal animation systemUnreal animation system
Unreal animation systemTonyCms
 
나만의 엔진 개발하기
나만의 엔진 개발하기나만의 엔진 개발하기
나만의 엔진 개발하기YEONG-CHEON YOU
 
C++20에서 리플렉션 기능 구현
C++20에서 리플렉션 기능 구현C++20에서 리플렉션 기능 구현
C++20에서 리플렉션 기능 구현Bongseok Cho
 
전형규, 좋은 이름, 나쁜 이름, 이상한 이름, NDC2018
전형규, 좋은 이름, 나쁜 이름, 이상한 이름, NDC2018전형규, 좋은 이름, 나쁜 이름, 이상한 이름, NDC2018
전형규, 좋은 이름, 나쁜 이름, 이상한 이름, NDC2018devCAT Studio, NEXON
 
UI아트 작업자를 위한 언리얼엔진4 UMG #1
UI아트 작업자를 위한 언리얼엔진4 UMG #1UI아트 작업자를 위한 언리얼엔진4 UMG #1
UI아트 작업자를 위한 언리얼엔진4 UMG #1Hong-Gi Joe
 
게임 개발에 자주 사용되는 디자인 패턴
게임 개발에 자주 사용되는 디자인 패턴게임 개발에 자주 사용되는 디자인 패턴
게임 개발에 자주 사용되는 디자인 패턴예림 임
 
멀티스레드 렌더링 (Multithreaded rendering)
멀티스레드 렌더링 (Multithreaded rendering)멀티스레드 렌더링 (Multithreaded rendering)
멀티스레드 렌더링 (Multithreaded rendering)Bongseok Cho
 
김혁, <드래곤 하운드>의 PBR과 레이트레이싱 렌더링 기법, NDC2019
김혁, <드래곤 하운드>의 PBR과 레이트레이싱 렌더링 기법, NDC2019김혁, <드래곤 하운드>의 PBR과 레이트레이싱 렌더링 기법, NDC2019
김혁, <드래곤 하운드>의 PBR과 레이트레이싱 렌더링 기법, NDC2019devCAT Studio, NEXON
 
심예람, <프로젝트DH> AI 내비게이션 시스템, NDC2018
심예람, <프로젝트DH> AI 내비게이션 시스템, NDC2018심예람, <프로젝트DH> AI 내비게이션 시스템, NDC2018
심예람, <프로젝트DH> AI 내비게이션 시스템, NDC2018devCAT Studio, NEXON
 
전형규, SilvervineUE4Lua: UE4에서 Lua 사용하기, NDC2019
전형규, SilvervineUE4Lua: UE4에서 Lua 사용하기, NDC2019전형규, SilvervineUE4Lua: UE4에서 Lua 사용하기, NDC2019
전형규, SilvervineUE4Lua: UE4에서 Lua 사용하기, NDC2019devCAT Studio, NEXON
 
윤석주, 신입 게임 프로그래머가 되는 법 - 넥슨 채용 프로세스 단계별 분석, NDC2019
윤석주, 신입 게임 프로그래머가 되는 법 - 넥슨 채용 프로세스 단계별 분석, NDC2019윤석주, 신입 게임 프로그래머가 되는 법 - 넥슨 채용 프로세스 단계별 분석, NDC2019
윤석주, 신입 게임 프로그래머가 되는 법 - 넥슨 채용 프로세스 단계별 분석, NDC2019devCAT Studio, NEXON
 
빠른 렌더링을 위한 오브젝트 제외 기술
빠른 렌더링을 위한 오브젝트 제외 기술빠른 렌더링을 위한 오브젝트 제외 기술
빠른 렌더링을 위한 오브젝트 제외 기술YEONG-CHEON YOU
 
조정훈, 게임 프로그래머를 위한 클래스 설계, NDC2012
조정훈, 게임 프로그래머를 위한 클래스 설계, NDC2012조정훈, 게임 프로그래머를 위한 클래스 설계, NDC2012
조정훈, 게임 프로그래머를 위한 클래스 설계, NDC2012devCAT Studio, NEXON
 
[Kgc2012] deferred forward 이창희
[Kgc2012] deferred forward 이창희[Kgc2012] deferred forward 이창희
[Kgc2012] deferred forward 이창희changehee lee
 
그럴듯한 랜덤 생성 컨텐츠 만들기
그럴듯한 랜덤 생성 컨텐츠 만들기그럴듯한 랜덤 생성 컨텐츠 만들기
그럴듯한 랜덤 생성 컨텐츠 만들기Yongha Kim
 
[IGC 2016] 넷게임즈 김영희 - Unreal4를 사용해 모바일 프로젝트 제작하기
[IGC 2016] 넷게임즈 김영희 - Unreal4를 사용해 모바일 프로젝트 제작하기[IGC 2016] 넷게임즈 김영희 - Unreal4를 사용해 모바일 프로젝트 제작하기
[IGC 2016] 넷게임즈 김영희 - Unreal4를 사용해 모바일 프로젝트 제작하기강 민우
 

What's hot (20)

리플렉션과 가비지 컬렉션
리플렉션과 가비지 컬렉션리플렉션과 가비지 컬렉션
리플렉션과 가비지 컬렉션
 
NDC2017 언리얼엔진4 디버깅 101 - 게임 기획자, 프로그래머가 버그와 만났을 때 사용할 수 있는 지침들
NDC2017 언리얼엔진4 디버깅 101 - 게임 기획자, 프로그래머가 버그와 만났을 때 사용할 수 있는 지침들NDC2017 언리얼엔진4 디버깅 101 - 게임 기획자, 프로그래머가 버그와 만났을 때 사용할 수 있는 지침들
NDC2017 언리얼엔진4 디버깅 101 - 게임 기획자, 프로그래머가 버그와 만났을 때 사용할 수 있는 지침들
 
Umg ,이벤트 바인딩, Invaidation Box
Umg ,이벤트 바인딩, Invaidation BoxUmg ,이벤트 바인딩, Invaidation Box
Umg ,이벤트 바인딩, Invaidation Box
 
Unreal animation system
Unreal animation systemUnreal animation system
Unreal animation system
 
나만의 엔진 개발하기
나만의 엔진 개발하기나만의 엔진 개발하기
나만의 엔진 개발하기
 
C++20에서 리플렉션 기능 구현
C++20에서 리플렉션 기능 구현C++20에서 리플렉션 기능 구현
C++20에서 리플렉션 기능 구현
 
행동 트리
행동 트리행동 트리
행동 트리
 
전형규, 좋은 이름, 나쁜 이름, 이상한 이름, NDC2018
전형규, 좋은 이름, 나쁜 이름, 이상한 이름, NDC2018전형규, 좋은 이름, 나쁜 이름, 이상한 이름, NDC2018
전형규, 좋은 이름, 나쁜 이름, 이상한 이름, NDC2018
 
UI아트 작업자를 위한 언리얼엔진4 UMG #1
UI아트 작업자를 위한 언리얼엔진4 UMG #1UI아트 작업자를 위한 언리얼엔진4 UMG #1
UI아트 작업자를 위한 언리얼엔진4 UMG #1
 
게임 개발에 자주 사용되는 디자인 패턴
게임 개발에 자주 사용되는 디자인 패턴게임 개발에 자주 사용되는 디자인 패턴
게임 개발에 자주 사용되는 디자인 패턴
 
멀티스레드 렌더링 (Multithreaded rendering)
멀티스레드 렌더링 (Multithreaded rendering)멀티스레드 렌더링 (Multithreaded rendering)
멀티스레드 렌더링 (Multithreaded rendering)
 
김혁, <드래곤 하운드>의 PBR과 레이트레이싱 렌더링 기법, NDC2019
김혁, <드래곤 하운드>의 PBR과 레이트레이싱 렌더링 기법, NDC2019김혁, <드래곤 하운드>의 PBR과 레이트레이싱 렌더링 기법, NDC2019
김혁, <드래곤 하운드>의 PBR과 레이트레이싱 렌더링 기법, NDC2019
 
심예람, <프로젝트DH> AI 내비게이션 시스템, NDC2018
심예람, <프로젝트DH> AI 내비게이션 시스템, NDC2018심예람, <프로젝트DH> AI 내비게이션 시스템, NDC2018
심예람, <프로젝트DH> AI 내비게이션 시스템, NDC2018
 
전형규, SilvervineUE4Lua: UE4에서 Lua 사용하기, NDC2019
전형규, SilvervineUE4Lua: UE4에서 Lua 사용하기, NDC2019전형규, SilvervineUE4Lua: UE4에서 Lua 사용하기, NDC2019
전형규, SilvervineUE4Lua: UE4에서 Lua 사용하기, NDC2019
 
윤석주, 신입 게임 프로그래머가 되는 법 - 넥슨 채용 프로세스 단계별 분석, NDC2019
윤석주, 신입 게임 프로그래머가 되는 법 - 넥슨 채용 프로세스 단계별 분석, NDC2019윤석주, 신입 게임 프로그래머가 되는 법 - 넥슨 채용 프로세스 단계별 분석, NDC2019
윤석주, 신입 게임 프로그래머가 되는 법 - 넥슨 채용 프로세스 단계별 분석, NDC2019
 
빠른 렌더링을 위한 오브젝트 제외 기술
빠른 렌더링을 위한 오브젝트 제외 기술빠른 렌더링을 위한 오브젝트 제외 기술
빠른 렌더링을 위한 오브젝트 제외 기술
 
조정훈, 게임 프로그래머를 위한 클래스 설계, NDC2012
조정훈, 게임 프로그래머를 위한 클래스 설계, NDC2012조정훈, 게임 프로그래머를 위한 클래스 설계, NDC2012
조정훈, 게임 프로그래머를 위한 클래스 설계, NDC2012
 
[Kgc2012] deferred forward 이창희
[Kgc2012] deferred forward 이창희[Kgc2012] deferred forward 이창희
[Kgc2012] deferred forward 이창희
 
그럴듯한 랜덤 생성 컨텐츠 만들기
그럴듯한 랜덤 생성 컨텐츠 만들기그럴듯한 랜덤 생성 컨텐츠 만들기
그럴듯한 랜덤 생성 컨텐츠 만들기
 
[IGC 2016] 넷게임즈 김영희 - Unreal4를 사용해 모바일 프로젝트 제작하기
[IGC 2016] 넷게임즈 김영희 - Unreal4를 사용해 모바일 프로젝트 제작하기[IGC 2016] 넷게임즈 김영희 - Unreal4를 사용해 모바일 프로젝트 제작하기
[IGC 2016] 넷게임즈 김영희 - Unreal4를 사용해 모바일 프로젝트 제작하기
 

Similar to Cpp에서 활용해보는 Lambda식

Effective c++chapter4
Effective c++chapter4Effective c++chapter4
Effective c++chapter4성연 김
 
Lambda 란 무엇인가
Lambda 란 무엇인가Lambda 란 무엇인가
Lambda 란 무엇인가Vong Sik Kong
 
Effective c++chapter1 and2
Effective c++chapter1 and2Effective c++chapter1 and2
Effective c++chapter1 and2성연 김
 
Chapter5 ~ 6
Chapter5 ~ 6Chapter5 ~ 6
Chapter5 ~ 6Injae Lee
 
이펙티브 C++ 5,6 장 스터디
이펙티브 C++ 5,6 장 스터디이펙티브 C++ 5,6 장 스터디
이펙티브 C++ 5,6 장 스터디quxn6
 
Effective c++ Chapter1,2
Effective c++ Chapter1,2Effective c++ Chapter1,2
Effective c++ Chapter1,2문익 장
 
Effective c++ 1~8장
Effective c++ 1~8장 Effective c++ 1~8장
Effective c++ 1~8장 Shin heemin
 
모어이펙티브 C++ 3,4장 예외, 효율 스터디
모어이펙티브 C++ 3,4장 예외, 효율 스터디모어이펙티브 C++ 3,4장 예외, 효율 스터디
모어이펙티브 C++ 3,4장 예외, 효율 스터디quxn6
 
Effective c++ chapter 1,2 요약
Effective c++ chapter 1,2 요약Effective c++ chapter 1,2 요약
Effective c++ chapter 1,2 요약Nam Hyeonuk
 
More effective c++ 챕터3~4ppt
More effective c++ 챕터3~4pptMore effective c++ 챕터3~4ppt
More effective c++ 챕터3~4pptInjae Lee
 
이펙티브 C++ (7~9)
이펙티브 C++ (7~9)이펙티브 C++ (7~9)
이펙티브 C++ (7~9)익성 조
 
Effective c++ 4
Effective c++ 4Effective c++ 4
Effective c++ 4현찬 양
 
Parallel objects
Parallel objectsParallel objects
Parallel objects용준 김
 
이펙티브 C++ 스터디
이펙티브 C++ 스터디이펙티브 C++ 스터디
이펙티브 C++ 스터디quxn6
 
Effective STL 1~4장 정리
Effective STL 1~4장 정리Effective STL 1~4장 정리
Effective STL 1~4장 정리Shin heemin
 
Mec++ chapter3,4
Mec++ chapter3,4Mec++ chapter3,4
Mec++ chapter3,4문익 장
 

Similar to Cpp에서 활용해보는 Lambda식 (20)

Effective c++chapter4
Effective c++chapter4Effective c++chapter4
Effective c++chapter4
 
Lambda 란 무엇인가
Lambda 란 무엇인가Lambda 란 무엇인가
Lambda 란 무엇인가
 
Effective c++chapter1 and2
Effective c++chapter1 and2Effective c++chapter1 and2
Effective c++chapter1 and2
 
Chapter5 ~ 6
Chapter5 ~ 6Chapter5 ~ 6
Chapter5 ~ 6
 
이펙티브 C++ 5,6 장 스터디
이펙티브 C++ 5,6 장 스터디이펙티브 C++ 5,6 장 스터디
이펙티브 C++ 5,6 장 스터디
 
MEC++ 3,4
MEC++ 3,4MEC++ 3,4
MEC++ 3,4
 
Effective c++ Chapter1,2
Effective c++ Chapter1,2Effective c++ Chapter1,2
Effective c++ Chapter1,2
 
Effective c++ 1~8장
Effective c++ 1~8장 Effective c++ 1~8장
Effective c++ 1~8장
 
모어이펙티브 C++ 3,4장 예외, 효율 스터디
모어이펙티브 C++ 3,4장 예외, 효율 스터디모어이펙티브 C++ 3,4장 예외, 효율 스터디
모어이펙티브 C++ 3,4장 예외, 효율 스터디
 
Effective c++ chapter 1,2 요약
Effective c++ chapter 1,2 요약Effective c++ chapter 1,2 요약
Effective c++ chapter 1,2 요약
 
More effective c++ 챕터3~4ppt
More effective c++ 챕터3~4pptMore effective c++ 챕터3~4ppt
More effective c++ 챕터3~4ppt
 
이펙티브 C++ (7~9)
이펙티브 C++ (7~9)이펙티브 C++ (7~9)
이펙티브 C++ (7~9)
 
Mec 56
Mec 56Mec 56
Mec 56
 
Effective c++ 4
Effective c++ 4Effective c++ 4
Effective c++ 4
 
Java_10 람다
Java_10 람다Java_10 람다
Java_10 람다
 
Java lambda
Java lambdaJava lambda
Java lambda
 
Parallel objects
Parallel objectsParallel objects
Parallel objects
 
이펙티브 C++ 스터디
이펙티브 C++ 스터디이펙티브 C++ 스터디
이펙티브 C++ 스터디
 
Effective STL 1~4장 정리
Effective STL 1~4장 정리Effective STL 1~4장 정리
Effective STL 1~4장 정리
 
Mec++ chapter3,4
Mec++ chapter3,4Mec++ chapter3,4
Mec++ chapter3,4
 

More from TonyCms

Unreal_SubSystem.pptx
Unreal_SubSystem.pptxUnreal_SubSystem.pptx
Unreal_SubSystem.pptxTonyCms
 
Unreal python
Unreal pythonUnreal python
Unreal pythonTonyCms
 
Effective cpp
Effective cppEffective cpp
Effective cppTonyCms
 
Unreal perception
Unreal perceptionUnreal perception
Unreal perceptionTonyCms
 
About matinee
About matineeAbout matinee
About matineeTonyCms
 
읽기 좋은 코드가 좋은 코드다.
읽기 좋은 코드가 좋은 코드다.읽기 좋은 코드가 좋은 코드다.
읽기 좋은 코드가 좋은 코드다.TonyCms
 
Cascade Shadow Map
Cascade Shadow MapCascade Shadow Map
Cascade Shadow MapTonyCms
 

More from TonyCms (7)

Unreal_SubSystem.pptx
Unreal_SubSystem.pptxUnreal_SubSystem.pptx
Unreal_SubSystem.pptx
 
Unreal python
Unreal pythonUnreal python
Unreal python
 
Effective cpp
Effective cppEffective cpp
Effective cpp
 
Unreal perception
Unreal perceptionUnreal perception
Unreal perception
 
About matinee
About matineeAbout matinee
About matinee
 
읽기 좋은 코드가 좋은 코드다.
읽기 좋은 코드가 좋은 코드다.읽기 좋은 코드가 좋은 코드다.
읽기 좋은 코드가 좋은 코드다.
 
Cascade Shadow Map
Cascade Shadow MapCascade Shadow Map
Cascade Shadow Map
 

Cpp에서 활용해보는 Lambda식

  • 2. 함수 객체 Lambda Capture 클로져 객체의 복사 생성자와 소멸자 람다의 전달 및 저장 Index 01 02 03 04 05
  • 3. Functor 함수 객체 람다를 알기 전에 미리 알아두면 좋은 내용.
  • 4. - 객체를 마치 함수처럼 사용하기에 붙여진 이름.(== Functor) - 함수가 되기 위한 조건 중 하나는 괄호 (함수 호출 연산자,Function call operator)를 사용해 파라미터 목록을 받는 것. - 어떤 객체를 함수처럼 사용한다는 것은 객체에 괄호를 붙여서 마치 겉 보기엔 함수를 호출하는 것처럼 사용한다는 의미. - 컴파일러가 이해할 수 있도록 클래스 안에서 함수호출 연산자를 오버로딩 해줘야 한다. 함수 객체(Function Object)01 4
  • 6. - 함수객체를 사용하는 이유는 성능상에서 이점을 가져올 수 있습니다. - STL을 이용할 때 인자로 함수를 받는 케이스들이 있습니다. ex) std::for_each(), std::count_if() - 이 때 인자로 함수 객체를 넘겨주게 되면, 그 바디가 인라인되어 성능에 상당한 이점을 가져갈 수 있습니다. 함수 객체(Function Object)01 6
  • 8. - C++ 11에 추가된 개념 - 함수 객체 (Function Object)보다 쉽고 편하게 사용할 수 있는 표 기법. - 익명 함수 객체를 정의하고 사용하는 표기법. - Java, C# 등 타 언어에서도 많이 쓰이는 개념. C++ Lambda02 8
  • 9. - Lambda는 크게 4개의 부분으로 구성되어 있습니다. 1. 개시자(Introducer) 2. 인자(Parameters) 3. 반환 타입(Return Type) 4. 함수의 몸통(Statement) C++ Lambda02 9
  • 10. - 개시자(Introducer) - 괄호 안에 어떤 외부 변수(my_mod)를 입력하게 되면 람다 함수 가 이를 캡쳐해서, 해당 변수를 람다 내부에서 이용할 수 있게 됩니 다. C++ Lambda02 10
  • 11. - 인자(Parameters) 람다가 실행 시 받을 인자를 입력. - 반환 타입 (Return Type) 람다가 종료될 때 반환할 타입 선언 - 몸통 (statement) 람다에서 실행할 내용. C++ Lambda02 11
  • 12. - Closure == Closed over(Closure) - 코드 상에 람다가 존재할 경우, 런타임 시 이름은 없지만, 메모리 상에 임시적으로 존재하는 Closure 객체가 생성됩니다. - Closure 객체는 함수 객체 처럼 행동합니다. - lazy evaluation (늦은 평가)이 가능합니다. C++ Lambda02 12
  • 14. - 어떤 벡터의 원소들의 모든 곱을 계산하는 코드를 작성해 볼 예정 입니다. - 각각 iterator / Functor / Lambda를 이용해서 작성해 볼 예정입니 다. C++ Lambda Practice03 14
  • 15. - 첫번째로 작성 해볼 코드는 바로 Iterator만을 사용한 코드입니다. C++ Lambda Practice03 15
  • 16. - Functor를 이용해서 작성한 코드 예제 입니다. - for_each를 사용해 이전 코 드의 while문을 모두 없앨 수 있습니다. - 하지만 Functor를 구성하는 코드를 작성하기 위해 위에 struct를 생성, void operator() 정의하는 부분이 추가되었습 니다. C++ Lambda Practice03 16
  • 17. - Lambda를 이용해서 작성한 코드 예제 입니다. - 짧고 간결하며, 깔끔하게 for_each문을 사용할 수 있게 되었 습니다. C++ Lambda Practice03 17
  • 18. - 람다식의 맨 뒤에 괄호()를 붙여서 바로 임시 클로져 객체를 실행시킬 수도 있습니다. - 리턴 타입이 void일 경우 ‘->’ 를 생략할 수 있습니다. - 받는 인자가 없을 경우, ()를 생략할 수 있습니다. C++ Lambda Practice03 18
  • 20. - 람다 안에서 람다 밖에 있는 변수들에게 접근하고자 할 때, 인자로 해당 변수들을 받을 수 없는 상황에서 접근할 수 있는 방법을 제공합니다. - 라이브러리를 사용하게 될 때 함수의 인자를 맞춰줘야 하는 상황이 생 기는데, 이 때 람다 내부와 외부가 ‘소통할 수 있게 하는 문’ 이라고 생각하 시면 될 것 같습니다. Ex) C++ STL - 캡쳐 하고자 하는 내용은 ‘[]’ 안에 적용하게 되는데, 대표적으로 4가지 의 형태를 지니고 있습니다. Capture04 21
  • 21. 1. [&]() { /* */ } - 외부의 모든 변수들을 레퍼런스로 가져온다.(함수의 Call-by-Reference) 2. [=]() { /* */ } - 외부의 모든 변수들을 값으로 가져온다.(함수의 Call-by-value) 3. [=, &x, &y] { /* */ } , 혹은 [&, x, y] { /* */ } 외부의 모든 변수들을 값/레퍼런스로 가져 오되, x와 y만 레퍼런스/값으로 가져온다. Capture04 22
  • 22. Capture04 23 - 여기서 예제 코드와 같은 형식으로 작성했을 때, 캡쳐를 레퍼런스가 아닌 값으 로 했을 때 변수를 언제 캡쳐하게 될까요? - 람다는 클로져 객체가 처음 생성될 때 변수들의 값을 캡쳐하게 됩니다. - 캡쳐를 값으로 할 때 주의점은 그 변수들에는 자동으로 const 속성이 붙는다는 것입니다.
  • 23. Capture04 24 위 예제에서는 cardinal에 있는 원소들을 for_each를 통해 순회하면서 total_elements에 곱하게 됩니다. 이 때 캡쳐는 & 이므로 외부 변수인 total_elements를 캡쳐 해서 수정할 수 있었습니다.
  • 24. Capture04 25 캡쳐의 범위에 아무것도 입력하지 않게되면 기본 캡쳐 모드가 없기 때문에 외부 변수를 수정할 수 없습니다.
  • 25. Capture04 27 - Call-by-Value 형식의 캡쳐를 사용하게 되면 이와 같은 컴파일 에러를 발생하 게 됩니다. - 위 코드에서 total_elements는 값으로 전달 받았으므로 const인데, 값을 바꾸 려고 하니 에러가 발생한 것입니다. - 그렇다면 함수 내부에서 값을 바꾸고자 하면 어떻게 해야할까요?
  • 26. Capture04 28 - 답은 mutable 속성을 추가해주시면 됩니다. - 람다 함수 외부의 지역변수인 i의 값은 변하지 않고, 오직 람다 함수 내부의 ‘ 어 떤 다른 i ’의 값이 변하는 것을 확인할 수 있습니다.
  • 27. 클로져 객체의 복사 생성자와 소멸자 객체의 생성과 복사
  • 28. 클로져 객체의 복사 생성자와 소멸자05 30 - 모든 클로져 객체들은 암묵적으로 복 사 생성자와 소멸자를 가지고 있습니다. - 먼저 복사 하지 않는 상황에서 람다 를 사용하는 예제를 먼저 보겠습니다. - f에서 t를 사용하지 않았으므로, t를 캡쳐하지 않게 됩니다.
  • 29. 클로져 객체의 복사 생성자와 소멸자05 31 - 먼저 m1를 생성하면서, 람다가 t를 캡쳐 했으므로 t의 복사 생성자가 호출되게 됩니 다. 왜냐면 캡쳐를 값으로 받았기 때문이죠. - 아래의 auto m2 = m1; 에서 클로져 객 체의 복사 생성이 일어나는데, 이 때 클로 져 객체의 복사 생성자가 값으로 캡쳐된 객 체들을 똑같이 복사 생성해주게 됩니다.
  • 30. 클로져 객체의 복사 생성자와 소멸자05 32 - 위에 말씀드렸던 것처럼, 캡쳐를 레 퍼런스로 받게 되면 복사 생성자가 호 출되지 않게 됩니다.
  • 31. 람다의 전달 및 저장 람다식 내부와 외부의 소통
  • 32. 람다의 전달 및 저장06 34 - 람다의 전달 방식의 또다른 방법으로 는 함수 포인터를 이용하는 방법이 있 습니다. - 이 경우에는 람다가 캡쳐하는 것이 없어야 합니다.
  • 33. 람다의 전달 및 저장06 35 - 람다 캡쳐하는 부분에 캡쳐 하는 방식을 전달하게 될 경우 적절한 변환 함수가 없다며 컴 파일 에러를 내게 됩니다.
  • 34. 람다의 전달 및 저장06 36 - C++ 11에서는 클로져 객체를 전달하고 또 저장할 수 있는 기능이 제공됩니다. - 바로 std::function입니다. 스 어떤 클로져 객체나 함수 등을 모두 보관 할 수 있는 저장소 입니다. - 참고로 Visual Studio 2010에서는 <functional> 을 include 시켜줘야합니다.
  • 35. 람다의 전달 및 저장06 37 - auto 키워드를 이용할 경우 변수를 정의할 때 해당 변수가 명확하게 구현되어야 컴파일 에서 타입을 추정할 수 있습니다. - auto를 이용하게 되면, 처음 캡쳐 부분에서 캡쳐하는 대상의 타입이 명확히 정해지지 않 은 상태이므로 타입을 추정할 수 없게 됩니다.
  • 36. 람다의 전달 및 저장06 38 - std::function을 이용할 경우 f1을 먼저 선언 만 해놓은 뒤 f2를 구현하고, 다시 f1을 구현할 수 있게 됩니다.
  • 37. 람다의 전달 및 저장06 39 - std::function을 사용하면 람다 함수로 재귀 호출 함수도 구현할 수 있게 됩니다.
  • 38. 참고 자료07 40 - 초보자를 위한 C++ 200제 (2판) - 씹어먹는 C++ 토막글 (https://modoocode.com/196) - VallistA C++11 :: Lamda Expression https://vallista.tistory.com/entry/C-11-Lambda-Expression- %EB%9E%8C%EB%8B%A4-%ED%91%9C%ED%98%84%EC%8B%9D- %ED%95%A8%EC%88%98-%EA%B0%9D%EC%B2%B4-Functor - jacking75 https://jacking75.github.io/cpp_stl_function/