마이크로소프트웨어 6월호에 실릴 C++ 0x 관련 글을 썼습니다.
제목은 『생각의 직관적인 표현, 람다(Lambda)』입니다.
기존에 흥배님께서 C++ 0x에 대해 이미 좋은 글들을 많이 쓰셔서 표절하지 않으면서 무엇을 써야 할지 정말 많은 고민을 했답니다. ;)
그래서 약간 Advanced 하면서 불친절하게(?) 특정 주제에 대해 나름대로 재해석해보기로 했습니다.
첫 주제는 람다(Lambda) 로 잡았구요 다음 편은 우측값 참조(RValue Reference) 에 대해 쓰려고 합니다.
원고 작성에 10일정도 시간이 있었는데요, 마지막날 피를 말리며 쓰게 되더군요.
다음 편은 어떨지... ㅋ
클라우드 컴퓨팅 관련해서 글을 써야 하는데 잠시 외도 중입니다. ;)
아래 브레인스토밍 하면서 작성 했던 요약 글을 옮겼습니다.
제목은 『생각의 직관적인 표현, 람다(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)를 사용 할 수 있게 됐다.
- 예제
- 코드 조각을 변수 처럼 사용하기
- 대입
- 입력, 반환 값
- 자료 구조에 저장
- 함수를 변수 처럼 사용 한다. 그리고 지역 변수를 포함할 수 있는 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
'Engineering' 카테고리의 다른 글
[Plus C++0x] 람다(Lambda) 이야기 (마지막회) (0) | 2010.05.31 |
---|---|
[Plus C++0x] 람다(Lambda) 이야기 (3) (1) | 2010.05.30 |
[Plus C++0x] 람다(Lambda) 이야기 (2) (0) | 2010.05.28 |
[Plus C++0x] 람다(Lambda) 이야기 (1) (0) | 2010.05.28 |