본문 바로가기

프로그래밍/시스템

C++ 11 람다표현식(Lambda expression)

반응형

 

  람다함수란?


 

프로그래밍 언어에서 사용되는 개념으로 이름이 없는함수(익명함수)를 지칭하는 용어다.

일반 함수의 경우 선언 , 정의 , 호출의 과정이 있지만 람다식은 이를 한번에 표현한다. 

 

 

▶ 장점

1.코드의 간결성: 효율적인 람다 함수의 사용을 통하여 불필요한 루프문의 삭제가 가능하며, 

동일한 함수를 재활용할 수 있는 여지가 커진다.

 

2.필요한 정보만을 사용하는 방식을 통한 퍼포먼스 향상: 지연 연산을 지원하는 방식을 통하여

효율적인 퍼포먼스를 기대할 수 있다. 

이 경우 메모리 상의 효율성 및 불필요한 연산의 배제가 가능하다는 장점이 있다.

 

▶ 단점

1.어떤 방법으로 작성해도 모든 원소를 전부 순회하는 경우는 람다식이 조금 느릴 수 밖에 없다. 

(어떤 방법으로 만들어도 최종 출력되는 bytecode나 어셈블리 코드는 단순 while(혹은 for) 문 보다 몇 단계를 더 거치게 된다.)

 

2.익명함수의 특성상 함수 외부의 캡처를 위해 캡처를 하는 시간제약 논리제약적인 요소도 고려해야한다.

 

3.람다식을 너무 남발하여 사용하게되면 오히려 코드를 이해하기 어려울 수 도 있다.

 

 

 

  람다식 구성


 

[ 캡처 된 변수 ] ( 인수 ) { 
 
    lambda code 
 
}
cs

※ 캡처 : 외부변수를 람다 함수 내부로 가져온다는 의미다.

 

▶ 캡처모드 종류

 기호  의미 
[=]   모든 외부 변수를 Capture by value
[&]  모든 외부 변수를 Capture by reference
[]  아무것도 캡처하지 않음
[x]  x만 Capture by valuex만 
[&x]  Capture by reference
[x,y]  x,y 를 Capture by value
[&x,y]   x는 Capture by reference , 
 y는 Capture by value
[&, y]   y 를 제외한 모든 값을 Capture by reference
[=, &x]  x 를 제외한 모든 값을 Capture by value

 

  예시

 

 

 

 

 

 


1. 모든 변수 캡처

 

for (int i = 0; i <= 10; i++)  [=]() { qDebug() << i; }();  
result : 1~10
cs

 

2. 특정 변수만 캡처

for (int i = 0; i <= 10; i++)  sum += [i]() { return i*10; }(); 
result : 550 
cs

 

3. QT에서 Connect에 람다표현식 사용

* QT 버전 5부터 connect 슬롯 함수에도 람다식 사용가능 
connect(ui->pushButton,&QPushButton::clicked, [this](){
          {
            ui->pushButton->setText("Clicked button");
          }});
cs

 

 

  유의 사항

 

 

 

 

 

 


C , Fortran , Pascal 등은 람다를 지원하지 않으며 java의 경우 8부터 , C++은 11부터 지원한다.

 

 

 

< 자료 참고 >

1. https://namu.wiki/w/%EB%9E%8C%EB%8B%A4%EC%8B%9D

2. http://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

 

반응형

'프로그래밍 > 시스템' 카테고리의 다른 글

C++ Qt 핑 프로그램 만들기  (0) 2018.05.04
C++ Qt 윈도우 배포용 라이브러리 추가  (0) 2018.05.04
C++ Qt 잡지식  (0) 2018.03.19
C++ Qt 엑셀 사용하기  (0) 2018.03.19
C++ Qt XML  (0) 2018.03.19