Engineering2010. 5. 23. 16:48
마이크로소프트웨어 6월호에 실릴 C++ 0x 관련 글을 썼습니다.
제목은 『생각의 직관적인 표현, 람다(Lambda)』입니다.
기존에
흥배님께서 C++ 0x에 대해 이미 좋은 글들을 많이 쓰셔서 표절하지 않으면서 무엇을 써야 할지 정말 많은 고민을 했답니다. ;)


그래서 약간 Advanced 하면서 불친절하게(?) 특정 주제에 대해 나름대로 재해석해보기로 했습니다.

첫 주제는 람다(Lambda) 로 잡았구요 다음 편은 우측값 참조(RValue Reference) 에 대해 쓰려고 합니다. 


원고 작성에 10일정도 시간이 있었는데요, 마지막날 피를 말리며 쓰게 되더군요.
다음 편은 어떨지... ㅋ


클라우드 컴퓨팅 관련해서 글을 써야 하는데 잠시 외도 중입니다. ;)
아래 브레인스토밍 하면서 작성 했던 요약 글을 옮겼습니다.




시작
하면서

  • 비트겐슈타인 "언어의 한계가 사고의 한계다"
    • 표현력 증가가 필요하다.
    • 언어에 가지 핵심 기능이 추가 되면서 획기적인 변화가 찾아왔다.
      • 생각을 코드로 직관적으로 표현 있도록 Lambda 추가 됐고
      • 객체 복사가 아닌 객체의 메모리 이동을 통해 성능을 향상 시킬 있는 Rvalue를 꼽을 있겠다.
    • C++0x 이런 언어적인 변경이 있었는데 Functional Language 모던 프로그래밍 언어들이 갖춘 Lambda 라는 기능이다.
  • VS2010 발표 되면서 VC++ 10 지원하는 실시간 에러 검사와 같은 막강한 기능이 추가 됐다.
    • 그렇지만 가장 장점은 C++0x 스펙을 충실히 구현했다는 것이다.
  • C++ 프로그래밍 방법에 변화가 오고 있다.
    • 동안 템플릿 인자 추론, 함수 객체의 답답함을 피 할 수 있다는 것.
  • 오늘 이야기는 다음 가지로 요약 있다.
    • C++0x 에서 코드 조각(a piece of code) 변수처럼 사용 있게 됐다.
    • C++0x 에서 클로저(Closure) 사용 있게 됐다.
  • 예제
    • 코드 조각을 변수 처럼 사용하기
      1. 대입
      1. 입력, 반환
      1. 자료 구조에 저장
  • 함수를 변수 처럼 사용 한다. 그리고 지역 변수를 포함할 있는 Capture 기능을 이용해 코딩 스타일을 어떻게 바꿔 있을까?
    • 이렇게 변수 처럼 사용할 있는 코드 조각을 Lambda 혹인 Lambda Function 이라고 한다.
    • 언어로 다른 언어를 만드는 Lisp 기능을 갖고 있기 때문!
  • 오늘은 람다라고 하는 "코드 조각" 주인공이다. 어려운 용어들을 이야기 .
  • First-Class Object, Higher-Order Function, Closure 같은 프로그래밍 언어 수업 시간에 나올 법한 용어를 익혀가다 보면 Lambda 대해 저절로 익히게 뿐만 아니라 현대 프로그래밍 언어의 개념

 

람다 함수는 함수 안에 정의 있는 이름 없는 함수(anonymous function) ?

  • 함수 형태를 띄고 있다.
  • 명세
    • [](){}()
  • 예제
  • 여러 있다.
  • 값을 반환 있다.
  • 인자를 받을 있다.

 

람다 함수 (Lambda Function) First-Class Object ?

  • First-Class Object 개념
    • 변수와 자료구조에 저장 하고 사용 있다.
    • 함수의 입력 값으로 사용 있다.
    • 함수의 반환 값으로 사용 있다.
    • 실행 시간에 생성 있다
  • , 프로그래밍 언어를 이루는 개체들 중에서 조건을 만족하면 First-Calss Object 라고 한다.
  • C++ 에서는 class, struct, int 들이고 C++ 0x 에서 lambda 추가 하면서 모던 프로그래밍 언어의 특징 이었던 함수의 First-Class Object 화가 일부 이루어 것이다.
  • 예제
    • 변수에 할당,
  • 요즘 인기 있는 언어들은 First-Class Object 범위를 늘려가고 있다.
  • 함수형 언어들은 함수가 First-Class Object 이기 때문

 

람다 함수 (Lambda Function) Higher-Order Function ?

  • Higher-Order Function 개념
    • First-Class Object 이기 때문에 higher-order function
  • 예제

 

람다 함수 (Lambda Function) Closure ?

  • Closure 개념 : 닫힘
  • 상위 코드 블록의 변수들을 Capture 있다.
  • 예제
  • = 참조, & 참조
     

이렇게 일반 변수 처럼 있는 코드 조각이 있으면 무엇이 편해 질까?

  • 변수 처럼 사용 있다는 것은
    • 저장 두었다가 원할 꺼내 있다는
    • 동적으로 생성이 가능하다는
    • 지역 변수 처럼 특정 코드 블록 내에서 바로 선언, 할당해서 사용 있다는
  • 상위 코드 블록의 변수들을 Capture 해서 언제든 실행( 또는 평가) 사용 있으면?

 

Lambda 활용

그렇다면 코드 조각을 변수처럼 그리고 클로저 개념을 사용하면 무엇을 있을까?

  • 지역 변수 처럼 코드 조각을 사용 있다
    • 잠깐 쓰고 코드를 지역 변수 처럼 있다.
  • Async 클래스
    • 코드 로직 흐름을 쉽게 만들 있다.
    • 비동기 처리
  • STL 에서 활용
    • 인자로 넘기는
      • Algorithm 에서 인자로 사용 있다.
    • STL Functor 사용이 불편 했던 이유는?
      • 지역 변수 처럼 블록 내에서만 사용해야 것을 외부에 클래스 마냥 구현해야 했다
        • 쓰고 버릴 코드들을..
        • 재활용이 필요 없는데 말이다.
  • Task 클래스
    • 템플릿을 사용하지 않고 함수 개념을 차용
      • 인자 추론이 필요 없음
      • 프로그래밍 스타일에 변화
    • 코딩 스타일의 변화가 필요하다.
      • 예전에는 어떻게서든 함수의 인자로 넘기기 위해 템플릿을 활용했었는데, 이제 Lambda 함수를 넘기면 된다.
      • Lambda Capture 기능을 활용하면 되는 .
      • 템플릿 사용을 줄여 보자.
        • 인자 추론을 Lambda 이용해 해결해 보자!
  • Task Manager 클래스
    • 코드 조각을 담아두고 코드를 지연 실행 시킬 있다.

 

마치며

  • "코드 조각을 변수처럼 사용하도록 사고를 넓혀 보면 어떨까?"
  • ps. 그렇다고 코드 조각을 포인터화 없냐고 물으신다면.. ;)

 

참고 자료

  • VS2010 블로그
  • MSDN

 

Posted by TedAhn