Skip to content

Latest commit

 

History

History
59 lines (39 loc) · 3.26 KB

LambdaExpression.md

File metadata and controls

59 lines (39 loc) · 3.26 KB

람다 표현(Lambda exmpression), 람다 함수(Lambda function)

람다 표현/람다 함수

람다 표현(Lambda expression)은 C++11 표준에서 만들어진 것으로 다른 곳에 전달될 수 있는 함수 개체이다. 람다 표현은 익명 함수라고도 하며 보통 다른 함수의 인자로 사용된다. 람다 표현은 함수나 함수 객체를 별도로 정의하지 않고 필요한 시점에 바로 함수 형태로 지접 만들어 쓸 수 있는 클로저(Closure)이다.

함수 객체보다 람다 표현을 사용하는 이유는 코딩이 간단해진다는 점과 코드의 가독성이 높다는 장점을 가지기 때문이다.
람다 표현을 이용하면 함수가 필요한 곳에 간단히 함수를 전달할 수 있다. 특히 함수가 한번만 사용되고 함수의 길이가 짧은 경우에 유용하다. C++에서 함수는 일급 객체가 아니다. 따라서 함수를 독립적으로 정의할 수 있는 방법이 없었다. 그리고 함수를 다른 함수의 인수로 전달하거나 함수 몸체를 반환하는 방법이 없었다. 그러나 함수형 프로그래밍 언어에서는 함수가 주요 요소이다. 그러므로 함수형 프로그래밍에서는 함수가 객체로 존재할 수 있다.

  • 일급 객체: 다른 객체들에 일반적으로 적용 가능한 연산을 모두 지원하는 객쳬이다. 일급 객체의 조건을 다음과 같다.
    • 변수에 할당(assignment)할 수 있다.
    • 다른 함수를 인자(argument)로 전달 받는다.
    • 다른 함수의 결과로서 리턴될 수 있다.

람다 표현 구문(Syntax)

[ 캡처 절 ] (인수1, 인수2, ....) -> 반환형 {     몸체     }

일반적으로 람다 표현은 한번만 사용되거나 정의가 짧은 경우에 유용하다. 람다 표현식으로 표현한 익명함수를 재사용하기 위해서는 다음과 같이 하면 된다. 람다는 알고리즘 또는 비동기 함수에 전달되는 몇 줄의 코드를 캡술화하는데 사용된다.

int main() {
  auto sum = [](int x, int y) {return x + y; }
  cout << "sum: " << sum(3, 4) << endl;
  cout << "sum: " << sum(10, 20) << endl;
  
  return 0;
}

앞 프로그램의 결과는 다음과 같다.

sum: 7
sum: 30

캡처 절

C++11의 람다 표현은 함수 외부에서 선언된 변수의 값을 복사 또는 참조의 형태로 캡처(capture)힌다. C++14에서는 해당 변수가 반드시 람다 표현 바깥에 존재하지 않아도 캡처 절에 새 변수를 도입하고 초기화할 수 있다. 이러한 초기화는 임의의 식으로 표현할 수 있다. 새 변수의 자료형은 람타 표현에서 생성되는 자료형에서 추론된다.

람다 표현은 함수 외부에서 변수에 엑세스 할 수 있어 일반 함수 보다 더 많은 기능을 가질 수 있다. 외부 변수의 캡처는 다음 세 가지 방식으로 이루어 질 수 있다.

  • [&}: 모든 외부 변수를 참조로 캡처 (참조로 캡처)
  • [=]: 모든 외부 변수를 값으로 캡처 (값으로 캡처)
  • [a, &b]: a는 값으로 b는 참조로 캡처 (혼합 캡처)
  • []: 해당 변수에 로컬인 변수에만 접근 가능함, 람다 표현의 몸체에서 함수 바깥 범위의 변수에 접근하지 못한다.