고수님들께 질문 드려요. C++에서 함수 포인터를 자주 사용하나요? 이론만 봤을 때는 이 함수 포인터라는 것을 언제 사용하는지 감이 잘 안오거든요. 혹시 유용하게 사용하는 경우를 아시면 알려주세요~~~
Effective C++에 strategy 패턴 대용으로 함수 포인터를 사용하는 방법이 나옵니다. 함수포인터 배열을 상태기계의 아이디를 배열의 인덱스로 하여 사용하기도 하구요. 디자인 패턴에서도 State패턴은 State가 많고 클래스가 작을 경우에는 State패턴을 쓰기에 적당하지 않다고 전하고 있고 그 대안으로 테이블을 이용한 방법을 제시하는데, 그 테이블을 함수포인터 배열로 구현이 가능하고요..
혹은 mem_func 등의 어댑터를 이용하여 함수자 대신으로 쓰기도 합니다.
poklog at http://poksion.cafe24.com/poklog/
보통 event-subscribe 모델에서 어떤 event에 대한 콜백 함수로 함수 포인터를 많이 쓰죠.
물론 자바틱하게 abstract class/interface를 argument로 받아서 정해진 함수이름을 불러주는 방법도 있지만, 그냥 함수 포인터를 사용하는게 편리할때가 많아요. (C++에선 물론 함수 포인터 뿐만 아니라 Object 포인터도 받아야겠죠.)
예를 들어 여러개의 event handler가 한 클래스 안에 존재하는 경우,
자바의 경우엔
class MyEventHandler implements A_listener, B_listener, C_listener { ... public void registerListeners() { _handler.add_A_listener(this); _handler.add_B_listener(this); _handler.add_C_listener(this); ... } }
이렇게 가야 되는데 listener interface들이 정확하게 정의 되있야되니까 이게 영 불편하거든요. (뭐 익숙하신 분들도 많겠지만 제 개인적인 생각으론말이죠...) 또 만일 두개의 listener들이 같은 함수 이름을 부르게 되있으면 또 골치 아프죠.
C++ 의 경우엔
class MyEventHandler { ... void registerListeners() { _handler.add_A_listener(this, CALLBACK a_handler); _handler.add_B_listener(this, CALLBACK b_handler); _handler.add_C_listener(this, CALLBACK c_handler); ... } };
이런 식으로 가니까 좀더 유동성이 있죠. 어느 클래스나 함수 형식만 같다면 콜백으로 바로 add할수 있으니까요.
일단 C 보다는 좀 적게 사용해도 되는 것 같습니다.
C에서 virtual function 구현하려고 하면 함수 포인터를 써야 하는데, C++에서도 마찬가지로 구현되긴 하지만 프로그래머가 함수 포인터를 따로 관리해서 쓸 필요는 없죠.
그리고 함수객체를 이용하여 해결 가능한 부분도 있습니다.
그러나 간단하게 함수 포인터를 만들어 쓰는게 좋을 때가 많아요. STL에 넣어도 잘 동작하구요.
이제는 서명에 무엇을 써야하는지 생각해보자.
블로그: http://turtleforward.blogspot.com
질문하신분이 초보입장이라고 가정하고 답글 적어 드리겠습니다.
처음 C/C++을 배우면서 "함수포인터라는 것도 있구나. 근데 대체 이건 어디 쓰는걸까?" 하는 의문이 들어서 질문을 하신거라면
C 표준함수중에 qsort()같은 함수를 한번 사용해 보세요. 인자로 함수포인터를 가집니다. 함수포인터가 왜 필요한지 기본적인 감은 올겁니다.
텍스트 포맷에 대한 자세한 정보
<code>
<blockcode>
<apache>
<applescript>
<autoconf>
<awk>
<bash>
<c>
<cpp>
<css>
<diff>
<drupal5>
<drupal6>
<gdb>
<html>
<html5>
<java>
<javascript>
<ldif>
<lua>
<make>
<mysql>
<perl>
<perl6>
<php>
<pgsql>
<proftpd>
<python>
<reg>
<spec>
<ruby>
<foo>
[foo]
Effective C++에 strategy
Effective C++에 strategy 패턴 대용으로 함수 포인터를 사용하는 방법이 나옵니다.
함수포인터 배열을 상태기계의 아이디를 배열의 인덱스로 하여 사용하기도 하구요.
디자인 패턴에서도 State패턴은 State가 많고 클래스가 작을 경우에는 State패턴을 쓰기에 적당하지 않다고 전하고 있고 그 대안으로 테이블을 이용한 방법을 제시하는데, 그 테이블을 함수포인터 배열로 구현이 가능하고요..
혹은 mem_func 등의 어댑터를 이용하여 함수자 대신으로 쓰기도 합니다.
poklog at http://poksion.cafe24.com/poklog/
poklog at http://poksion.cafe24.com/poklog/
Call back functions
보통 event-subscribe 모델에서 어떤 event에 대한 콜백 함수로 함수 포인터를 많이 쓰죠.
물론 자바틱하게 abstract class/interface를 argument로 받아서 정해진 함수이름을 불러주는 방법도 있지만, 그냥 함수 포인터를 사용하는게 편리할때가 많아요. (C++에선 물론 함수 포인터 뿐만 아니라 Object 포인터도 받아야겠죠.)
예를 들어 여러개의 event handler가 한 클래스 안에 존재하는 경우,
자바의 경우엔
class MyEventHandler implements A_listener, B_listener, C_listener {
...
public void registerListeners() {
_handler.add_A_listener(this);
_handler.add_B_listener(this);
_handler.add_C_listener(this);
...
}
}
이렇게 가야 되는데 listener interface들이 정확하게 정의 되있야되니까 이게 영 불편하거든요. (뭐 익숙하신 분들도 많겠지만 제 개인적인 생각으론말이죠...)
또 만일 두개의 listener들이 같은 함수 이름을 부르게 되있으면 또 골치 아프죠.
C++ 의 경우엔
class MyEventHandler {
...
void registerListeners() {
_handler.add_A_listener(this, CALLBACK a_handler);
_handler.add_B_listener(this, CALLBACK b_handler);
_handler.add_C_listener(this, CALLBACK c_handler);
...
}
};
이런 식으로 가니까 좀더 유동성이 있죠.
어느 클래스나 함수 형식만 같다면 콜백으로 바로 add할수 있으니까요.
일단 C 보다는 좀 적게 사용해도 되는 것 같습니다.
일단 C 보다는 좀 적게 사용해도 되는 것 같습니다.
C에서 virtual function 구현하려고 하면 함수 포인터를 써야 하는데, C++에서도 마찬가지로 구현되긴 하지만 프로그래머가 함수 포인터를 따로 관리해서 쓸 필요는 없죠.
그리고 함수객체를 이용하여 해결 가능한 부분도 있습니다.
그러나 간단하게 함수 포인터를 만들어 쓰는게 좋을 때가 많아요. STL에 넣어도 잘 동작하구요.
이제는 서명에 무엇을 써야하는지 생각해보자.
블로그: http://turtleforward.blogspot.com
C/C++ 입문 과정이라면...
질문하신분이 초보입장이라고 가정하고 답글 적어 드리겠습니다.
처음 C/C++을 배우면서
"함수포인터라는 것도 있구나. 근데 대체 이건 어디 쓰는걸까?"
하는 의문이 들어서 질문을 하신거라면
C 표준함수중에 qsort()같은 함수를 한번 사용해 보세요.
인자로 함수포인터를 가집니다.
함수포인터가 왜 필요한지 기본적인 감은 올겁니다.
댓글 달기