'2012/12'에 해당되는 글 2건

  1. Lambda Expressions in C++ 2012.12.23
  2. unity 렌더링 여부 체크 2012.12.04

Lambda Expressions in C++

from 번역 2012.12.23 07:54
일러두기
  1. 원문 : http://msdn.microsoft.com/ko-kr/library/dd293608.aspx (12년 12월 23일 기준)
  2. 본문은 샘플 코드를 포함하지 않으며 샘플 코드는 원본을 참고. 문서의 권리는 MSDN 사용 약관 참고.
  3. 번역상 혼동이 올 수 있는 중요한 단어는 한글 단어 뒤에 영단어를 그대로 표기함.



Visual C++에서 lambda 표현식-이하 람다-이란, 상태를 유지하고, 자신을 감싸는enclosing 스코프의 변수에 접근할 수 있는 익명의 함수같은 것이다. 이 문서는 람다가 무엇인지 정의하고, 이것을 다른 프로그래밍 기법들과 비교하여, 그 장점을 서술하고 기본적인 예제를 제공한다.



람다에 대하여

많은 프로그래밍 언어들은 익명 함수의 개념을 제공하는데, 이는 몸체body가 있되 이름이 없는 함수이다. 람다는 익명 함수와 관련된 프로그래밍 기법이다. 하나의 람다는 암묵적으로 함수 객체function object를 정의하고 그 타입의 인스턴스를 만든다. 함수 객체에 대해 더 많은 정보를 얻고 싶다면, 함수 객체 항목을 보라.


[중요]

람다는 다음과 같은 공용 언어 런타임의 관리되는 entity를 지원하지 않는다 : ref class , ref struct, value class, value struct



함수 객체 vs 람다

우리가 코드를 작성할 때, 아마 함수 포인터와 함수 객체를 문제 해결에 사용하는데 특히 STL을 사용해 계산할 때 그렇다. 함수 포인터와 함수 객체는 장단점이 있는데 예를 들면, 함수 포인터는 구문상의 오버헤드는 최소화하지만 스코프 안의 상태를 유지할 수 없고, 함수 객체는 상태를 유지할 수 있지만 클래스 하나 분량의 구문상의 오버헤드를 요구한다.


람다는 함수 포인터와 함수 객체의 장점을 조합하고 그들의 단점을 회피한다. 함수 객체와 같이, 람다는 유연하고 상태를 유지할 수 있다. 그러나 함수 객체와 달리 람다의 컴팩트한 문법은 클래스 정의를 필요로 하지 않는다. 람다를 사용함으로서, 우리는 함수 객체와 동등하지만 덜 거추장스럽고 덜 오류를 발생시키는 코드를 작성할 수 있다.



예제 1 : 람다 사용하기

본 예제는 vector안의 요소가 홀수인지 짝수인지를 콘솔에 출력하기 위해, for_each 함수 호출 안에서 람다를 사용한다.


[코드:원문참고]


코멘트

예제 안에서, for_each의 3번째 인자는 람다이다. [&evenCount] 부분은 표현식의 캡처 항목을 명시하며, (int n)은 매개변수 목록을 명시하고, 나머지는 표현식의 몸체이다.



예제 2 : 함수 객체 사용하기. 

때때로 람다는 이전 예제 이상으로 확장하기에 불편할 수도 있다. 다음 예제는 for_each문과 함께 람다 대신 함수 객체를 사용해 예제 1과 같은 결과를 보여준다. 두 예제는 vector 안의 짝수의 갯수를 저장한다.  동작의 상태를 유지하기 위해서 FunctorClass 클래스는 m_evenCount 변수에 참조를 멤버변수로서 저장한다. 동작을 수행하기 위해 FunctorClass는 함수 호출 연산자인 operator()를 구현한다. Visual C++컴파일러는 예제 1의 람다 코드와 유사한 사이즈와 퍼포먼스의 코드를 생성한다. 본문의 것과 같은 기본적인 문제를 위해서는, 보다 단순한 람다 설계가 함수 객체 설계보다 낫다. 그러나 당신이 생각하기에 그 기능이 미래에 중요한 확장을 요구할 수도 있다면 함수 객체 설계가 코드 유지보수를 편하게 할 것이다.


operator()에 대해 더 많은 정보가 필요하면 함수 호출(C++)을 보라. for_each에 대해 더 많은 정보가 필요하면 for_each를 보라.


[코드:원문참고]


요약

람다는 강력하고 인상적인 프로그래밍 기법이다. 람다의 세부사항과 특성들에 대해 학습하려면 람다 표현식 구문을 보라. 람다를 당신의 프로그램에 어떻게 쓸 지 배우려면 람다 표현식 예제를 보라.

Tag // C++, lambda

어떤 카메라든 각 카메라의 절두체 안에 들어와 다음 프레임에 화면에 표시 될 경우,

OnBacameVisible이 호출된다.

반대로 어떤 카메라로부터도 보이지 않을 경우 OnBacameInvisible이 호출된다.

각자는 Renderer컴포넌트가 GameObject에 붙어있을 때에만 호출된다.

Tag // unity3D