이 포스트의 목적

  • 일반화 함수자(함수 객체)를 만들어 보는 것이다.
  • 일반화 함수자(함수 객체)를 이해하는 것 이다.

이 포스트의 준비물

  • Firefox 4.0 beta6
  • Winamp v.5.572 (x86)

참조 서적

  • 주 : Modern C++ Design p.175 ~ p.176
  • 부1 : Effective STL p.245~
  • 부2 : C++ Standard Libaray 튜토리얼 레퍼런스 p.345~

참조 링크

내용

왜 제목이 일반화 함수자(함수 객체)와 Command 패턴인가 하면

  • Command 패턴에서 "호출 가능한 객체의 저장 방법"으로 함수자(함수 객체)가 편하기 때문이다.
    - Command 패턴은 메세지와 그 메세지의 처리를 연결시키는 패턴 쯤 된다.

그러면 지금부터 일반화 함수자란 무엇이고, command 패턴이란 무엇인지 알아보겠다. 우선 패턴이라는 추상 개념은 설명하기 어려우므로, 실체부터 보도록 하자.

일반화 함수자(함수 객체)란 무엇을 말하는가?

  • 영어로는 Generalized Functors 라고 한다.
  • 우리나라 말로는 일반화 함수 객체 라고도 한다.

  • 하는일로써 정리하면, C++ 이 허용하는 호출 가능한 객체를 담을 수 있는 객체를 뜻한다.
    - 쉽게 말해, 함수, 함수 포인터, 함수자, 멤버 함수, 전역함수, 인라인 함수 등등을 먹을 수 있는 객체를 뜻한다.

함수자(함수 객체)와 함수 포인터와의 차이점은 무엇인가?

  • 함수자는 자신의 상태를 갖을 수 있고, 포인터는 자신의 상태를 갖을 수 없다.
    - 일반적인 호출 가능한 객체들도 상태를 갖을 수 있으나, 별도의 작업을 필요로 한다.
    - 참조 서적을 읽어 보면, 보다 더 자세히 알수 있다.

  • 함수자는 STL에 잘 달라 붙고, 포인터는 붙어 달라고 졸라야 한다.

  • 함수자는 값으로 평가 되고, 함수 포인터는 레퍼런스로 평가 된다.
    - 이 때문에, 생성/소멸 시점을 잡을 수 있고, 복사나 대입 연산이 용이해진다.(상태를 갖을 수 있으니까!)

여기서 상태를 갖을수 있는 차이점이 핵심이다.

그렇다면, 함수자(함수 객체)와 일반화 함수자(함수 객체)는 무엇이 다른가?

함수자(함수 객체)를 더 사용하기 쉬운 형태로 만든게 일반화 함수자(함수 객체)이다.

일반화 함수자는 다음의 특징이 있다:

  • 모든 호출 가능한 객체를 캡슐화 한다.
    - C++ 이 허용하는 모든 호출 가능한 객체를 말이다!

  • 자료형에 대해 안전하다.
    - 템플릿을 사용하기 때문에, 완전히 함수 인자와 함수가 대응된다.

나는 함수자(함수 객체)를 여기까지 정리한다. 아리송 하다면, 다른 많은 글을 보길 바란다.

여담

  • Command 패턴도 같이 적으려고 했는데, 2부에서 다루어야 겠다.


  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 라이프코리아트위터 공유하기
  • shared
  • 카카오스토리 공유하기