출처: http://msdn.microsoft.com/library/dd293608
출처를 읽고 정리한 글입니다.
람다라고도 불리는 람다식(lambda expression)은 익명 함수(anonymous function)와 유사합니다. 익명 함수는 현재 상태를 유지하고 범위 내의 변수들을 접근할 수 있습니다.
본 글에서는 람다가 무엇인지를 정의하고, 다른 프로그래밍 기법들과 비교합니다. 그리고, 람다의 장점과 기본적인 예제를 제시합니다.
람다의 개요
많은 프로그래밍 언어들은 익명 함수(anonymous function)의 개념을 지원합니다. 익명 함수는 함수의 내용은 있지만 이름이 없는 함수를 의미합니다. 람다는 익명 함수와 관련된 프로그래밍 기법입니다. 람다는 묵시적으로 함수 객체(function object) 클래스를 정의하고 그 클래스 타입의 함수 객체를 생성합니다. 함수 객체에 대해서는 MSDN의 Function object (http://msdn.microsoft.com/en-US/library/aa985932)를 참고하시기 바랍니다.
C++ 표준에서는 람다가 std::sort() 함수에 전달되는 파라미터로 사용되는 예를 보여줍니다.
#include <algorithm> #include <cmath> |
중요 람다는 다음과 같은 common language runtime(CLR) managed entity에서는 지원되지 않습니다: ref class, ref struct, value class, or value struct |
|
함수 객체 vs. 람다
프로그램을 작성할 때 특히 STL algorithm을 사용하는 경우에는 함수 포인터(function pointer)와 함수 객체(function object)를 사용할 것입니다. 함수 포인터와 함수 객체는 장단점을 갖고 있습니다. 예를 들어, 함수 포인터는 문법적 오버헤드를 최소화 하지만, 스코프에 해당하는 상태를 유지하지 않습니다. 함수 객체는 상태는 유지할 수 있지만 클래스 정의에 따르는 문법적 오버헤드가 있습니다.
람다는 함수 포인터와 함수 객체의 장점을 조합하고 이들의 단점을 제외한 것입니다. 람다는 함수 객체처럼 유연하며 상태를 유지할 수 있지만 함수 객체와는 다르게 클래스 정의가 필요하지 않습니다. 람다를 사용함으로써 함수 객체보다 간단하고 오류가 적게 발생하는 코드를 작성할 수 있습니다.
다음의 예는 람다와 함수 객체의 사용을 비교한 것입니다. 처음 예는 람다를 사용하여 vector 객체에 있는 요소들이 홀수인지 짝수인지 여부를 출력하는 프로그램이고 두 번째 예는 같은 작업을 함수 객체를 사용하여 수행하는 것입니다.
Example 1: 람다 사용
// even_lambda.cpp int main() // Count the number of even numbers in the vector by // Print the count of even numbers to the console. |
Output
1 is odd |
Comments
예제 1의 for_each 함수의 세번째 인수가 람다입니다. [&evenCount]는 람다식의 capture 입니다. (int n)은 람다식의 인수이고, 나머지 부분은 람다식의 내용입니다.
Example 2: 함수 객체 사용
다음의 예제는 example 1과 같은 결과를 내지만 람다 대신에 함수 객체를 사용한 것입니다. 두 예제 모두 vector 객체에 있는 짝수의 수를 저장합니다.
// even_functor.cpp class FunctorClass // The function-call operator prints whether the number is if (n % 2 == 0) { private: int& m_evenCount; // the number of even variables in the vector. };
int main() // Count the number of even numbers in the vector by // Print the count of even numbers to the console. |
Summary
람다는 강력하고 표현력이 강한 프로그래밍 기법입니다. 람다의 문법에 대해서 공부를 하기 위해서는 Lambda Expression Syntax (http://msdn.microsoft.com/en-US/library/dd293603)를 참고하시기 바랍니다. 람다의 사용법에 대해서는 Examples of Lambda Expression (http://msdn.microsoft.com/en-US/library/dd293599) 를 참고하시기 바랍니다.
'개발 > Visual C++' 카테고리의 다른 글
VS2013 GLUT 설정 (0) | 2014.10.02 |
---|---|
VS 2013 "fatal error LNK1104: 'kernel32.lib' 파일을 열 수 없습니다" 오류 대처 방법 (0) | 2014.10.02 |
Visual Studio 2010에서 헤더/소스 전환 방법 (0) | 2014.08.03 |
error C2995: 함수 템플릿이 이미 정의되었습니다. 오류 대처 방법 (0) | 2014.08.02 |
error C2143: 구문 오류 : ';'이(가) '&' 앞에 없습니다. 오류의 대처 방법 (0) | 2014.08.01 |