본문 바로가기

lambda(람다) 본문

C++

lambda(람다)

니렙에잠이오냐 2019. 4. 4. 23:18

1)Lambda??

lambda는 람다 표현식, 익명함수라고도 불린다. 람다는 함수객체를 암시적으로 정의하고 함수객체를 생성합니다.

 

프로그래밍을 하다보면 함수포인터나 함수 객체가 필요한 시점이 있다. 함수객체의 가장 큰 단점은 정의 할때 구조체나 클래스를 사용해야 한다는 점이다. 그로 인해 코드도 길어지고 보기도 좋지 않다. 

 

람다는 함수포인터와 함수 객체의 장점만을 골라서 가져왔다고 볼 수 있다.

 

2)Lambda의 구조

lambda표현식은 캡쳐(capture),인자(parameter),반환형(returnType),몸통(body)로 이루어져 있습니다.

a) 캡쳐

[] : 캡쳐 블록이라고 불리며 생략할 수 없습니다. 외부 변수를 사용하지 않겠다는 뜻입니다.

 

[=] : 는 값을 복사하여 사용하겠다는 뜻이다.

[&] : 는 값을 참조하여 사용하겠다는 뜻이다.

--> 이때 특정 변수를 쓰지 않으면 전체를 복사 또는 참조하여 사용하겠다는 뜻이다.

 

ex) -----------------------------------------------------------------------------------------------------

[a,&b] : a를 복사로 캡쳐 , b를 참조로 캡쳐한다.

[this] : 현재 객체를 참조로 캡쳐한다.

[&] : 몸통에 쓰이는 모든 변수나 상수를 참조로 캡쳐하고 현재 객체를 참조로 캡쳐한다.

[=] : 몸통에 쓰이는 모든 변수나 상수를 값복사로 캡쳐한다. 

------------------------------------------------------------------------------------------------------------

b)인자

인자는 생략 할수 있고 생략시에는 인자가 없는 것으로 간주한다.

 

c)반환형

반환형은 생략이 가능하다. 생략했을 경우에는 몸통에서 반환해주는 반환값이 자동적으로 적용된다.

 

d)몸통

함수의 실행내용을 작성하는 곳과 같다. 실질적으로 함수를 구동할 내용들이 들어간다.

 

기본적인 람다는 이런 구조를 가지고 있지만 추가적으로 알아두면 좋은 내용들이 두가지가 더 있다.

 

e)매개인자를 넣는 방법중에는 다음과 같은 방법도 있다.

ex) [=](int a)->int{return a+1;}(10);

 

f)mutable

캡쳐블록에서 캡쳐한 외부변수가 복사 될때에는 내부에 변수가 새로 만들어지고 const 지정자가 붙어서 복사되므로 이 값을 람다함수 내부에서 바꿀 수 없다.

반면에 muatable이 붙으면 외부변수를 복사 할 때 const가 붙지 않는다.

ex) [=](int a)mutable->int{return a+1;}

 

'C++' 카테고리의 다른 글

MYSQL 연습 - 2(INSERT, SELECT, UPDATE, DELETE)  (0) 2019.06.08
MYSQL 연습 - 1(MYSQL 기본 연동)  (0) 2019.06.07
캐시 메모리에 대해  (0) 2019.06.05
해쉬 테이블(HashTable)  (0) 2019.04.04
C++ 키워드 : final, explicit  (0) 2019.04.03
Comments