Visual Studio 2010 공식 팀 블로그 @vsts2010

Posted by 흥배

클로져 사용하기 1

 

그럼 이제 클러져에 대해서 알아 보겠습니다.

람다를 사용할 때 람다 식 외부에 정의되어 있는 변수를 람다 식 내에서 사용한 후 결과를 그 변수에 그대로 저장하고 싶을 때가 있습니다. 이럴 때 클로져를 사용하면 됩니다.

클로져는 참조나 복사로 전달이 가능합니다. 참조를 사용하는 경우는 &을 사용하면 됩니다.

람다 표현의

  

[](파라메터) { }

에서 앞의 ‘[]’ 사이에 클로져할 변수를 기술하면 됩니다.

 

< Code 4. >

int main()

{

           vector< int > Moneys;

           Moneys.push_back( 100 );

           Moneys.push_back( 4000 );

           Moneys.push_back( 50 );

           Moneys.push_back( 7 );

 

           int TotalMoney1 = 0;

           for_each(Moneys.begin(), Moneys.end(), [&TotalMoney1](int Money) {

             TotalMoney1 += Money;

           });

          

           cout << "Total Money 1 : " << TotalMoney1 << endl;

           return 0;

}

 

< 결과 >


람다 식이 외부에 있는 TotalMoney1 변수를 참조로 캡쳐(capture)(람다 식의 외부에 있는 것을 사용할 때 캡쳐한다고 합니다) 하여 Moneys 벡터에 있는 값을 모두 더하고 있습니다.

 

그럼 TotalMoney1 변수를 값으로 전달하면 어떻게 될까요?

for_each(Moneys.begin(), Moneys.end(), [TotalMoney1](int Money) {

             TotalMoney1 += Money;

           });


이렇게 하면 아래와 같은 컴파일 에러가 발생합니다.

“error C3491: 'TotalMoney1': a by-value capture cannot be modified in a non-mutable lambda

 


그럼 포인터 전달은 어떨까요?

< Code 5. >

………….

int TotalMoney2 = 0;

int* pTotalMoney2 = &TotalMoney2;

for_each(Moneys.begin(), Moneys.end(), [pTotalMoney2](int Money) {

             *pTotalMoney2 += Money;

           });

          

cout << "Total Money 2 : " << TotalMoney2 << endl;

 ………..

 

< 결과 >


당연히 잘 됩니다.^^




클로져에 대한 이야기가 끝난 것은 아닙니다. 다음 회에 나머지 이야기를 다 할테니 기다려 주세요 ~



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

댓글을 달아 주세요