삽질의 현장/- C++

#031_시(c)시(c)해서 C++?!_ 함수 객체가 뭘까요?

shovelman 2015. 8. 1. 02:54


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


하하... 어제의 글로 분명 C++에 대한 정리를 끝냈다고 생각했지만
막상 함수 객체에 대해 접할 기회가 있었는데 가물가물 가물치 한 것입니다...
죄송합니다. 지금 자고 일어나서 제정신이 아닙니다...

자... 잠도 깰꼄... 
오늘도 힘차게 달려보겠습니다~!


함수 객체에 대해 알아보기 이전에는 연산자 중복 정의를 알아야합니다...
지난 시간에 연산자 중복정의에 대한 간략한 정리를 진행 했었죠...
그래서 함수 객체를 헷갈려하는 사단이... 발생...
아무튼... 그러면 이번에는 우선 연산자 중복 정의에 대한
핵심만을 간략하게 정리하고 본론인 함수 객체로 들어가보도록 하겠습니다.

연산자 중복정의는 
'피연산자 중에 최소 하나 이상이 사용자 정의 형식일 경우에 해당 연산에 대한 기능을 정의 하는것'
을 말합니다.
즉, 연산자의 기능에 대해서 사용자가 정의를 할 수 있게 되는 것이죠.

이게 핵심입니다... 푸하하 간단하군요... 
그럼 본론으로 넘어가서...

함수 객체란, 말 그대로 객체를 함수처럼 사용하는 것이지요...
즉, 함수 호출 연산자가( '()' ) 중복 정의 되어 
해당 객체를 함수처럼 사용할 수 있는 객체가 되어 버린다는~!

한 예로써, STL 에서 지원하는 find_if의 원형을 보자면 아래와 같습니다.
본 함수의 원형은 정확한 내용을 추구하기 위해여 MSDN에서 가져옴을 알립니다.

1
2
3
4
5
 
template<class InputIterator, class Predicate> 
InputIterator 
find_if(InputIterator first, InputIterator last, Predicate pred);
 
cs

find_if는 간략하게 검색할 범위의 처음 위치부터 끝 위치까지 세번째 인자인
조건자와 비교하여 그 조건이 맞는 첫번째 값을 알려주는 역할을 하고 있습니다

이때에 세번째 인자에는 함수 객체를 사용합니다.
왜냐? 그렇게 find_if 내부에서 약속을 했기 때문입니다.

1
2
3
4
5
6
7
8
9
10
11
 
template<class _InIt,
    class _Pr> inline
    _InIt _Find_if(_InIt _First, _InIt _Last, _Pr _Pred)
    {    // find first satisfying _Pred
    for (; _First != _Last; ++_First)
        if (_Pred(*_First))
            break;
    return (_First);
    }
 
cs


find_if의 내부를 호출하고 호출하고 호출하고.... 그러다보면 결국 위와 같은 코드를 확인하실 수 있게 됩니다.

세번째 인자에 첫번째 인자를 인자로 하는 ....

유상무상무가 또 나왔다...


" if (_Pred(*_First)) "


아무튼... 이와 같은 형태를 확인 해보세요...

인자인데 이 인자의 요소는 함수호출을 하고 있습니다.

이렇게 대개 여러 STL 에서 제공하는 함수들에는 함수 객체를 사용하도록 하고 있습니다.


이 함수 객체의 역할은,

객체를 함수화 했기 때문에, 함수 호출 연산자( '()' )를 사용하면 

이에 해당 객체의 클래스 내부에 정의된 함수 호출 연산에 의해 

인자로 받는 값과 자신이 가지고 있는 멤버의 값을 비교하여 원하는 위치를 찾을 수 있게 해줍니다.


어떻게 보면 콜백의 역할을 해주고 있는것이 

지금 find_if 시점에서 함수 객체가 해주고 있는 것이네요...


만약, '함수로 전달하면 되지 않느냐' 라는 의문이 생기실 수 있지만,

잘 생각해보신다면, 함수 이름만을 호출하면 검색하고자 하는 데이터를 전달 할 수 없게 됩니다.


따라서 함수 객체를 사용하는 이유이지요.



음... 이유에 대해서는 디버깅과 여러 질문들을 통해 시원하게 해결하지 못했습니다...

다음 시간에는 더욱 자세하게

함수 객체의 사용 이유에 대해서 알아보도록 해야겠군요...


이상 삽잡이였습니다~!