Visual Studio 2010 공식 팀 블로그 @vsts2010

Posted by 흥배

이번은 C++0x에서의 새로운 기능 중의 하나인 Lambda에서 대해서 설명하겠습니다.

C#이나 동적 프로그래밍 언어를 공부 하신 분들은 Lambda에 대해서 들어보셨을 것입니다.

 

람다를 잘 모르는 분들을 위해서 현재 가장 쉽게 Lambda를 접할 수 있는 C#을 통해서 Lambda 사용 예를 들어보겠습니다.

(C#을 모르고 C++만 아는 분들이라도 무리 없이 볼 수 있으니 그냥 넘어가지 마시고 봐 주세요. C# 이야기는 조금만 할께요^^)

 

 

 

C#에서의 람다 식

 

람다 식은 식과 문을 포함하여 대리자나 식 트리 형식을 만드는데 사용할 수 있는 익명함수입니다.

 

형식은 다음과 같습니다.  

입력 매개 변수 => or

 

람다 식은 주로 어떤 라이브러리의 식과 결합해서 사용할 식을 만들 때 사용합니다.

람다 식이 없다면 다른 식과 결합하기 위해서는 따로 함수를 만들어서 사용해야 되므로 거추장스러워 지는데 람다 식을 사용하면 아주 간단하게 구현할 수 있습니다.

 

< Code 1. C# - 이름 중 문자 길이가 TextLength 보다 작은 이름 >

string[] MobNames = { "Babo", "Cat", "Orge", "Tester", "CEO" };

int TextLength = 4;

           

// 람다 식 사용

var ShortNames1 = MobNames.Where(MobName => MobName.Length < TextLength);

 

// foreach 사용

List<string> ShortNames2 = new List<string>();

foreach(string MobName in MobNames)

{

     if (MobName.Length < TextLength)

     {

         ShortNames2.Add(MobName);

     }

}

 

<Code 1>을 보면 람다 식을 사용하면 한 줄로 끝나는 것을 람다 식을 사용하지 않으면 List 컨테이너를 생성하고 foreach 구문을 사용하여 이름을 하나씩 조사하여 List 컨테이너에 추가해야 되는 코드가 필요해집니다.

 

C#에서 람다 식이 가장 유용하게 사용되는 부분은 Linq 일겁니다.

만약 Linq에서 람다 식을 사용하지 않게 된다면…Linq 사용하기가 꽤 힘들어지겠죠

 

 

 

C++에서 STL 알고리즘을 사용했던 불편했던 것

 

기존의 C++에서 STL find_if, sort 등의 알고리즘을 사용할 때 특정 조건자를 사용하기 위해서는 펑터(functer)를 만들어야 합니다. 그런데 이것 때문에 따로 펑터를 만드는 것이 귀찮아서 보통 그냥 따로 함수를 만들어서 구현하기도 합니다.

 

< Code 2. 펑터를 사용한 find_if 알고리즘>

#include <iostream>

#include <algorithm>

#include <vector>

 

using namespace std;

 

class User

{

public:

           User() : m_bDie(false) {}

           ~User() {}

 

           void SetDie() { m_bDie = true; }

           bool IsDie() { return m_bDie; }

 

private:

           bool m_bDie;

};

 

struct FindDieUser

{

           bool operator()  (User& tUser) const { return tUser.IsDie(); }

};

 

int main()

{

           vector< User > Users;

           User     tUser1;             Users.push_back(tUser1);

           User     tUser2;             tUser2.SetDie();   Users.push_back(tUser2);

           User     tUser3;             Users.push_back(tUser3);

 

           vector< User >::iterator Iter;

           Iter = find_if( Users.begin(), Users.end(), FindDieUser() );

 

           return 0;

}

 

<Code 2>는 유저들 중 죽은 유저를 찾기 위해 find_if 알고리즘을 사용했는데 이것 때문에 struct로 펑터를 만들어야 됩니다. 궂이 펑터까지 만들지 않고 그냥 간단하게 기술하면 좋겠죠.

혹시 <Code 1>에서 C#에서는 람다 식으로 쉽게 구현했던 것을 보니 <Code > find_if 알고리즘도 이런 것을 사용하면 좋겠죠? ^^

 

그래서 C++0x에서 람다가 새로 생겼습니다.

 

 

 

람다란 ?

 

먼저 람다와 관련된 용어를 정의하겠습니다.

 

Lambda

람다 식 또는 람다 함수라고 부르며 무명 함수 오브젝트를 가리키는 식입니다.

 

Closure

클로져 : 람다 식이 컴파일러 의해 평가된 결과로 자동적으로 생성되는 무명 함수 오브젝트.

클로져는 람다 함수를 정의함 코드 내에서 참조된 변수가 무명 함수 오브젝트의 멤버 변수로서 유지 되던가 아니면 람다 함수가 생성된 프레임 포인터가 무명 함수 오브젝트 내에 유지 되는 것을 의미합니다.

 

람다 함수의 무엇을 말하는지 좀 알겠는데 클로져는 약간 알쏭달쏭 하시죠? 걱정 마세요. 앞으로 나올 설명과 코드를 보면 쉽게 이해할 수 있습니다.^^




이번은 C#을 통해서 람다라는 것이 어떤 것인지 살짝 소개하고, C++에서 STL 알고리즘에서 펑터를 사용할 때의 불편함 점, 람다 용어 설명으로 마치겠습니다.

C++0X에서 람다를 어떻게 사용하는지는 다음 글에서 본격적으로 설명하겠습니다.


글 하나에 너무 많은 글을 적으면 잘 보지 않을 것 같아서 이번 글에서는 일단 덮밥만 뿌려놓겠습니다. ^^;;;

저작자 표시
크리에이티브 커먼즈 라이선스
Creative Commons License

댓글을 달아 주세요

  1. 최근 channel9 비디오를 보니 이 람다를 boost에서처럼 라이브러리 기능으로 가져갈지 언어 자체 기능으로 가져갈지 논란이 많았다더군요. 끝내 언어 자체 기능으로 가져간 것을 보면 람다를 상당히 필수적인 기능으로 본듯합니다.

    • 그렇군요. 근래에 VC++ 팀에서 Boost 컨퍼런스에서 람다로만 학 세션을 강연했더군요. 람다 이거 파봐야 될게 많을것 같아요

  2. 그렇군요. 근래에 VC++ 팀에서 Boost 컨퍼런스에서 람다로만 학 세션을 강연했더군요. 람다 이거 파봐야 될게 많을것 같아요

  3. 와우... 2010/01/27 06:12

    골수 C++ 추종자로써.. C++이 계속 발전 한다는 것 (특히 람다같은 것의 지원)은 정말 환영할 일입니다...