함수 포인터와 함수 객체를 사용하는 이유를 알고 싶습니다.
글쓴이: vi08 / 작성시간: 월, 2014/03/24 - 5:28오후
C에서 함수 포인터를 사용하는 이유는 < 유연성을 위해서 > 라고 알고 있습니다.
함수 포인터에 그때그때 다르게 정의된 함수를 대입하여 사용한다, 까지는 알겠습니다.
많은 분들이 함수 포인터가 유용하게 쓰이는 곳이 Callback와 Strategy 패턴이라고 말씀하시던데
Strategy 패턴은 차치하고서, Callback 함수에서 함수 포인터가 유용하게 쓰이는 이유를 알고 싶습니다.
아니, 정확히는 어떤 방식이길래 유용하게 쓰이는지를 알고 싶네요.
함수 객체는 아예 미지의 대상입니다. 함수 포인터를 사용하면 되니까 쓰지 말라는 막연한 말만 들었네요.
대체 무엇 때문에 사용하는 건가요? STL이 범용성과 효율성을 추구한다면 함수 객체도 나름의 범용성과 효율성을 갖췄을 텐데.
함수 포인터와 함수 객체의 장단점과, 각각을 비교해서 무엇이 어떤 상황에서 더 나은지, 나쁜지를 알고 싶습니다~
Forums:
콜백에 대해선 qsort 함수를 다양한 상황에서
콜백에 대해선 qsort 함수를 다양한 상황에서 사용해보시면 될 것 같습니다. (예를 들어 학생들의 성적을 국어 성적에 따라 소트한다던지, 영어 성적에 따라 소트한다던지)
함수 포인터를 사용하면 되니까 함수 객체를 사용하지 말라는 건 누가 그러던가요?
인라이닝 등과 같은 효과 때문에 함수 포인터 보다는 함수 객체를 사용하는 것이 더 나은 경우가 많습니다. 람다와 같이 적용할 경우에는 더더욱 그렇구요.
역시 인라이닝 때문인가요;
질문을 올린 후 함수 포인터에 대해 공부를 하다 인라이닝이 제대로 적용이 안 된다는 걸 알았습니다.
이후 함수 객체를 배우고는 인라이닝과 템플릿이 적용되어 함수 포인터보다 훨씬 범용적이고 속도도 빠르다는 걸 알았네요.
하지만 이젠 람다가 미제로 남았습니다ㅋㅋㅋㅋ
대화를 할때 명사만 쓰는게 아니라 동사도 쓰고 싶은데
대화를 할때 명사만 쓰는게 아니라 동사도 쓰고 싶은데 그럴방법이 없으니 동사를 명사화시켜서 전달하는 겁니다
에구;
공부가 많이 부족하네요. 이해할 수 있도록 노력하겠습니다ㅠㅠ
이거 읽어보시면 도움이 될듯 합니다.
http://en.wikipedia.org/wiki/Function_object
가장 중요한 차이점은 스테이트 관리의 용이성입니다. 클래스를 사용할 수 있으므로 상태관리가 편해집니다. (물론 전통적인 콜백을 쓴다고 해서 불가능한 건 아닙니다.)
그리고 퍼포먼스상의 이점도 존재합니다. http://www.kbasm.com/cpp-callback-benchmark.html
또한 C++11이나 C#에 이르러서는 어나니머스 펑션(비슷한 말로 델리게이트, 람다함수 등등..)마저 사용할 수 있기 때문에 구현이 매우 편해집니다. 위에 링크한 위키백과 페이지에 예제들이 나와있으므로 참고하시면 좋겠네요. C#에서는 정말 많이 쓰입니다.
그럼에도 불구하고 여전히 전통적인 콜백을 사용해야 할 경우도 많은데 제일 흔한 이유가 환경상의 제약이지요. 전형적인 C스타일 라이브러리를 제공해야 한다든지, 현재 가져다 쓰고 있는 라이브러리가 콜백 함수 포인터를 요구한다든지 하면 어쩔 수 없지요. 아니면 스테이트 관리가 불필요한 경우 콜백 형태가 보기에 제일 직관적인 경우도 많고 이런 경우 굳이 더 복잡해보이는 방법을 쓸 필요도 없겠죠.
--
이것도 공부가 부족하네요ㅜㅜ
상태 관리라 함은 FSM 같은 걸 말씀하시는 건가요;?
상태라고 하는 것은
말 그대로 아무거나 다 가능한 겁니다. 특정 모델을 의미하는 것이 아닙니다.
본문 주제에 관해선 그냥 추상적인 대상을 생각하시는게 편하고 굳이 뭔가 명칭이 정해진 것에만 한정지어 생각하실 필요는 없습니다. 대상을 명기하는 쪽이 더 이해하기 편하시면 상관은 없는데, 특정 개념에만 한정지어 용도를 생각하셔선 안된다는 얘기.
--
지금 잘 공감이 안가시면 조금 더 큰 규모의
지금 잘 공감이 안가시면 조금 더 큰 규모의 어플리케이션을 작성해보세요.
댓글 달기