728x90

람다(lambda)는 '람다 함수' 또는 '이름 없는 함수'라고 부르며, 그 성질은 함수 객체와 같다.


기존 C++에서 STL의 find_if, sort 등의 알고리즘을 사용할 때 특정 조건자를 사용하려면 함수 객체를 정의해야 했다.

그런데 STL 알고리즘 함수에서만 사용하려고 따로 함수 객체를 만들려니 귀찮을 수 밖에 없었다.

그래서 보통은 함수를 따로 만들거나, 함수를 정의하는 것도 귀찮아서 그냥 STL을 사용안하고 직접 컨테이너를 다루었다.

람다 덕택에 이제는 이런 수고를 할 필요가 없어졌다.


람다의 기본 문법은 다음과 같다.


다음은 람다의 간단한 사용 예다.


auto를 사용하면 람다를 변수에 대입 할 수도 있다.


람다는 일반 함수처럼 파라미터를 정의 할 수도 있다.


반환 값도 사용할 수 있다.


find_if를 쓸 때에는 더욱 유용한 것을 느낄 수 있다.


기존에는 다음과 같이 find_if 알고리즘을 이용해서 '죽은 유저'를 찾으려면 다음과 같이 함수 객체를 정의해야 했다. 

하지만 람다를 사용하게 되면, 한 줄로 간단하게 끝낼 수 있다.



* 람다는 'decltype' 과 'sizeof' 에서는 사용할 수 없다.

728x90

'Basic Programming > C++ 11' 카테고리의 다른 글

C++11 - nullptr  (0) 2016.02.26
C++11 - enum  (0) 2016.02.26
C++11 - range based for  (0) 2016.02.25
C++11 - 람다(lambda) 함수 - 2  (0) 2016.02.25
C++11 - auto 키워드  (0) 2015.12.08
728x90

아마도 C++ 11에서 가장 인기 있는 기능이 auto일 것이다. auto를 가장 잘 말해주는 예는


 

위 처럼 써야 할 것을 C++ 11에서는 


이렇게 쓸 수 있다. 


역시 auto는 그냥 일반 자료형 보다는 STL을 사용할 때 훨씬 편하게 코딩할 수 있게 만들어 준다.


* auto는 지역 변수에서만 사용할 수 있으므로, 클래스의 멤버 변수나 전역 변수, 함수의 인자로는 사용할 수 없다.

* auto는 '변수를 정의할 때 명시적으로 형을 지정하지 않고 컴파일을 할 때 자동으로 결정해주는 키워드' 이다.


728x90

'Basic Programming > C++ 11' 카테고리의 다른 글

C++11 - nullptr  (0) 2016.02.26
C++11 - enum  (0) 2016.02.26
C++11 - range based for  (0) 2016.02.25
C++11 - 람다(lambda) 함수 - 2  (0) 2016.02.25
C++11 - 람다(lambda) 함수 - 1  (0) 2015.12.08
728x90

object라는 클래스가 있다는 가정하에 헤더파일에 선언할 수 있는 4가지 타입의 전역변수는 아래와 같습니다.

1. object var;
2. static object var;
3. exturn object var;
4. typedef Singleton <object> var;

1번과 같은 경우 2개 이상의 cpp파일에서 해당 헤더파일을 포함하는 경우, 변수가 미리 정의되어 있다는 에러를 발생시킵니다. 즉, 1개의 cpp파일을 위해서만 정의할 수 있는, 단순히 cpp파일에 선언한 것을 헤더파일로 옮긴거 외에는 의미를 가지지 않습니다.

뭐랄까? 1개의 cpp파일을 위한 전역변수가 되겠죠.

2번과 같은 경우 2개 이상의 cpp파일에서 해당 변수를 사용할 수 있습니다. 왜냐하면 헤더파일을 포함한 cpp파일의 개수만큼 객체가 생성되기 때문입니다. 전역변수기는 한데 각각의 cpp파일마다 각각의 전역변수가 생성됩니다. 뭐, 좀 더 정확하게 표현하자면 헤더파일을 포함하는 각각의 cpp파일에서만 사용하는 로컬변수라고 부를 수 있겠죠. 용어에서 헷갈리는 이유는 변수의 생존 범위인데, 쥔장의 개념에서 지역변수의 개념은 함수안에서만 존재하는 변수를 지역변수라고 생각했기 때문입니다. 그리고는 단순하게 로컬변수가 아닌 변수는 전역변수라고 생각했기 때문에... (흠... 지금도 헷갈림...켁~)

3번과 같은 경우는 cout, cin과 같은 우리가 흔희 보는 STL의 전역변수들이 사용하는 기법입니다. 진정으로 여러 cpp파일에서 공유하는 한개의 전역변수가 생성됩니다. 즉, C/C++에서 전역변수라고 불리는 것은 3번과 같은 경우가 될 것입니다.

4번과 같은 경우는 Design Pattern의 하나로서 1개의 객체만을 생성하게 됩니다. 전역변수의 개념이나 3번과 같이 compiler에 의해서가 아닌 테크닉에 의하여 생성되게 됩니다. 실제적으로는 클래스의 typedef이며 var::Instance() 와 같이 클래스의 static함수를 사용하여 1개의 전역변수를 사용하게 됩니다.

패턴주의자라면 4번을 선호할 것이며 C에서 부터 C++로 넘어오신 분이면 3번을 선호할 것 입니다.

초급을 넘어서면 심심할 때 고민할 이 둘의 차이에 대해서 말하자면 구글형이 가르켜준 Singleton VS global object 라는 토론에 잘 나와 있습니다. 인상깊었던 내용의 일부를 이야기하자면 표면적으로 비슷하지만 Singleton 쪽이 좀 깔끔하게 정의할 수 있고 (extern은 특정 cpp파일에서 실제 객체의 정의해야 하며, 전역객체가 많아지면 특정 객체의 정의 위치를 찾는 것도 한 일 되겠죠?) 그 외에 config파일 사용, 늦은 초기화 등의 테크닉을 사용할 수 있다는 장점이 있습니다. 개인적으로 그 외의 차이점은 전역변수 같은 경우는 전역변수를 다루는 메모리에 들어가는데 비하여 Singleton은 생성된 객체가 힙메모리에 위치하는 차이점이 있는듯 보입니다.


- 출처 : http://linkmemo.tistory.com/entry/C-%ED%97%A4%EB%8D%94%ED%8C%8C%EC%9D%BC%EC%97%90-%EC%84%A0%EC%96%B8%ED%95%A0-%EC%88%98-%EC%9E%88%EB%8A%94-4%EA%B0%80%EC%A7%80-%ED%83%80%EC%9E%85%EC%9D%98-%EC%A0%84%EC%97%AD%EB%B3%80%EC%88%98

728x90

+ Recent posts