삽질의 현장/- C++

#032_시(c)시(c)해서 C++?!_ Lambda 그리고 함수 객체를 사용하는 이유.

shovelman 2015. 8. 1. 04:56


안녕하세요~! 삽잡이 입니다.


예전에 이런말을 들은 적이 있습니다.

' 아는 만큼 보일 것이다...' 

지금 생각했을때, 예전에 프로그래밍 언어에 대해서 질문을 했던 내용들을 떠올려보면

참으로 부끄럽고도 우스운 내용들이 다반사였습니다.


지금 보면 별것 아닌 지식들이... 그 예전에는 왜 그런지에 대해 이해조차 가지 않았었는데...

아는 만금 보인다라... 

아직 패기 넘치는 혈기 왕성한 삽잡이는 알아가는 재미가 쏠쏠합니다.


더욱 폭 넓은 지식을 습득하기 위해, 더욱 폭 넓은 견문을 가지기 위해

오늘도 삽잡이는 열심히 삽질을 하겠습니다~!



자... 이번 시간에는 함수 객체를 사용하는 이유에 대해서 알아보겠습니다.

함수 객체에 대해서 왜 사용해야하는지 이게 뭔가하는 궁금증을 가지고 있었습니다... 

하지만 그 궁금증은 시원하게 풀리지 않았었죠... 


결국 질문을 하고 하고 하고 왕왕 하다가, 힌트를 얻게 됬습니다.

'lambda','lambda calculus', 'anonymous function' ...

아 이거면 나의 궁금증을 풀 수 있겠어! 하며 열심히 검색을 시작했습니다..


뭐냐... 람다, 람다 계산, 익명 함수.... 람다 = 익명 함수

아하... 결국 셋중 둘은 동일한 키워드인 것 같고...

그럼 람다의 시초? 가 될 ... lambda calculus에 대해 알아봐야 할 것 같습니다.


Lambda Calculus...

람다 대수입니다. 구글링으로 뒤적였는데, 수학적 모델로 '알론소 처치'라는 분이 만드셨군요...

함수 정의, 함수 응용, 재귀 등을 조사하기 위해 설계된 형식 시스템이라고 합니다... 웩...

음... 진짜 뭔 x소리인지... 푸하하...


결론적으로 말씀드리자면, 함수를 추상화 해주는 개념입니다.

함수를 단순하게 표현 할 수 있게 해준 개념이 바로 람다 대수라는 것이지요...


이러한 개념이 프로그래밍 언어의 발전을 도와준 것이고요....

이정도로 람다 대수에 대해서 맛본 것에 의미를 두고...


아무튼... 뭐... 그렇습니다... 함수의 추상화... 이름 없는 함수...

람다는 이름이 없는 함수랍니다.


역시 모르면 MSDN이죠... 람다를 사용한 예시를 가져왔습니다.


1
2
[](float a, float b) {
            return (std::abs(a) < std::abs(b));
cs

아하.... 정말 이름이 없는데 몸체는 있군요
이 이름없는 람다라는 녀석 덕분에 함수 객체를 사용할 이유가 없어졌다고 합니다...

니 근데 저는 지급 함수 객체를 사용하는 이유에 대해서 알아보려고 한거 아닌가요?
역시 난 삽질을... 하하... 하지만 의미 없는 삽질은 없다고 하지 않습니까?
우선은, 계속해서 살펴보시죠...


생각해보도록 하죠... 

람다를 지원하게 됨으로써 함수 객체를 더이상 쓸 필요가 없어졌다...


우선 지난 시간 함수 객체를 소개하며 사용한 find_if를 가져와보도록 하겠습니다...

그 중에서도 함수 객체 부분만 말입니다...


1
2
 if (_Pred(*_First))
    break;
cs


살펴보시는 바와 같이 짧군요....


함수 객체는 호출을 하는 것인데, 람다 함수는 호출을 할 필요 없이 

인자 들을 사용하여 바로 바로 조건을 진행합니다...


즉, 인자 전달을 할 필요 없이 상태를 가지며 조건 기능을 수행한다는 것이죠.


람다 함수를 사용하면, 함수 객체와 같이 호출할 필요가 없이 

해당 자리에서 단 두줄의 코드만을 가지고 조건 비교를 하는 기능을 수행할 수 있게 됬습니다.


그런데 말입니다...

우리는 함수를 객체를 사용하는 이유에 대해서 알아보고 있지 않았습니까?


이미 답은 나온 것 같습니다. 람다에 대해서 찾아보면서 말입니다.

람다라는 기능이 나옴으로 함수 객체를 더 이상 사용할 필요가 없다고 언급을 했는데요,

이는 람다 기능만으로도 비교할 데이터와 비교에 사용될 데이터

두 인자를 참조/복사로 캡쳐하여 비교할 수 있기 때문입니다.


아하... 함수 객체를 사용하는 이유는

두 인자를 비교하기 위해서 사용하는 것이었습니다...


함수 객체를 사용하게 되면 객체 내에 멤버 필드로 데이터를 저장하고

인자로 비교할 데이터를 보내어 그 두 데이터를 비교하여 값을 반환할 수 있기 때문입니다.


즉, 함수 호출 연산자를 객체 내에 중복 정의하여

전달 받은 인자와 해당 객체에 저장되어 있는 값을 비교할 수 있다는 것입니다. 



내가 가지고 있는 값과 비교 연산을 하기 위해 함수 객체를 사용했었습니다.

그런데, C++에서 람다 기능을 지원하게 됨으로써

굳이 비교를 위해 데이터를 저장할 클래스를 만들 필요 없이

바로 상태를 가지며 그 자리에서 비교를 할 수 있게 되었습니다.


람다 기능에 대해서 알아보다 보니,

자연스레 함수 객체의 사용 이유에 대해서 알게 되었습니다.


아하... 이제 궁금증이 해결 됬습니다. 물론, 저만 됬겠죠...? 허허...

명확한 설명을 하지 못하고, 

횡성 수설하며 머리로 이해한 것을 글로 표현하지 못하는 걸 보니

아직 완벽히 이해 하지 못했나 봅니다...


하하... 이 글을 통해 저와 같은 궁금증을 가지셨던 분들의 궁금증이 해소되셨길 바라지만...

이해하시지 못하셨다면, 따로 람다에 대해서 알아보시길 추천합니다...


왜 람다에 대해서 알아보냐고 여쭈어 보신다면, 위에서 언급했던 것과 같이

람다 기능을 사용함으로써 함수 객체의 필요성이 보다 줄었기 때문입니다.

함수 객체의 기능에서 장점만 쫙쫙 뽑아낸 람다...


람다에 대해서 찾아보신다면, 

자연스레 함수 객체에 대한 이해가 머릿속에 박힐 것이라고 말씀드리고 싶네요... 

물론, 람다를 알 필요 없이 함수 객체만을 찾아보며 이해하시는게 훨씬 빠를 수도 있을 듯 합니다...


이 한적한 새벽에 뭐하는 것인지... 하하...

더욱 확실한 이해가 되면, 추후 더욱 양질의 설명을 해드리기를 약속하며

이상 글을 마무리 짓겠습니다...


이상 삽잡이였습니다~!