관리 메뉴

기억을 위한 기록들

[CPP] 함수 객체에 관하여 본문

C & CPP

[CPP] 함수 객체에 관하여

에드윈H 2022. 2. 2. 21:10

 

어떤클래스의 함수 호출 연산자를 오버로딩해서 그 클래스의 객체를 함수 포인터처럼 사용하게 만들 수 있다.

이렇게 사용하는 객체를 함수 객체 또는 간단히 펑터라 부른다.

 

표준 라이브러리 알고리즘 (STL 알고리즘) 중에 find_if()와 accumulate()를 비롯한 여러 알고리즘은 함수 포인터, 람다 표현식, 펑터 등을 비롯한 호출 가능한 객체를 인수로 받아서 여러 알고리즘의 동작을 변경할 수 있다. C++는 이를 위해 여러가지 펑터 클래스를 <functional> 헤더파일에 정의 해두었다. 이런것들은 주로 콜백 연산에 자주 사용된다.

&amp;amp;lt;functinal&amp;amp;gt; 헤더 파일 중 일부

 

 

펑터의 개념은 간단하지만 작성과정은 상당히 번거롭다.

함수나 펑터 클래스를 생성해서 다른 것과 중복되지 않게 이름을 정한 다음, 그 이름을 사용하도록 작성해야한다.

이럴 때는 람다표현식을 이용하며 익명함수로 만들면 굉장히 편한다.

 

 

현재 사용하는 c++버전에 따라 <functional> 헤더파일에는 bind1st(),bind2nd(),mem_fun(), mem_fun_ref(), ptr_fun()과 같은 함수도 정의 돼 있을 수도 있다. 이들 함수는 C++17부터 공식적으로 삭제됐다. 

 

 

 

어떤 문법이든 사용하고 말고에 대한것에 상황에 따라 다르고, 사용하더라도 각각의 장단점이 있겠지만, 람다 표현식을 사용하면 코드 읽기 쉽고, 세련되게 작성할 수 있다. 함수 객체보다는 람다 표현식으로 간단히 작성하는 것이 바람직하다. 함수객체는 람다 표현식으로 할수 없는 복잡한 작업을 처리할 때만 사용하기 바란다.

 

 

참고서적 :

http://www.yes24.com/Product/Goods/77669043