함수 포인터와 함수 객체를 사용하는 이유를 알고 싶습니다.

vi08의 이미지

C에서 함수 포인터를 사용하는 이유는 < 유연성을 위해서 > 라고 알고 있습니다.

함수 포인터에 그때그때 다르게 정의된 함수를 대입하여 사용한다, 까지는 알겠습니다.

많은 분들이 함수 포인터가 유용하게 쓰이는 곳이 Callback와 Strategy 패턴이라고 말씀하시던데

Strategy 패턴은 차치하고서, Callback 함수에서 함수 포인터가 유용하게 쓰이는 이유를 알고 싶습니다.

아니, 정확히는 어떤 방식이길래 유용하게 쓰이는지를 알고 싶네요.

함수 객체는 아예 미지의 대상입니다. 함수 포인터를 사용하면 되니까 쓰지 말라는 막연한 말만 들었네요.

대체 무엇 때문에 사용하는 건가요? STL이 범용성과 효율성을 추구한다면 함수 객체도 나름의 범용성과 효율성을 갖췄을 텐데.

함수 포인터와 함수 객체의 장단점과, 각각을 비교해서 무엇이 어떤 상황에서 더 나은지, 나쁜지를 알고 싶습니다~

kukyakya의 이미지

콜백에 대해선 qsort 함수를 다양한 상황에서 사용해보시면 될 것 같습니다. (예를 들어 학생들의 성적을 국어 성적에 따라 소트한다던지, 영어 성적에 따라 소트한다던지)

함수 포인터를 사용하면 되니까 함수 객체를 사용하지 말라는 건 누가 그러던가요?
인라이닝 등과 같은 효과 때문에 함수 포인터 보다는 함수 객체를 사용하는 것이 더 나은 경우가 많습니다. 람다와 같이 적용할 경우에는 더더욱 그렇구요.

vi08의 이미지

질문을 올린 후 함수 포인터에 대해 공부를 하다 인라이닝이 제대로 적용이 안 된다는 걸 알았습니다.

이후 함수 객체를 배우고는 인라이닝과 템플릿이 적용되어 함수 포인터보다 훨씬 범용적이고 속도도 빠르다는 걸 알았네요.

하지만 이젠 람다가 미제로 남았습니다ㅋㅋㅋㅋ

익명 사용자의 이미지

대화를 할때 명사만 쓰는게 아니라 동사도 쓰고 싶은데 그럴방법이 없으니 동사를 명사화시켜서 전달하는 겁니다

vi08의 이미지

공부가 많이 부족하네요. 이해할 수 있도록 노력하겠습니다ㅠㅠ

mirheekl의 이미지

http://en.wikipedia.org/wiki/Function_object

가장 중요한 차이점은 스테이트 관리의 용이성입니다. 클래스를 사용할 수 있으므로 상태관리가 편해집니다. (물론 전통적인 콜백을 쓴다고 해서 불가능한 건 아닙니다.)

그리고 퍼포먼스상의 이점도 존재합니다. http://www.kbasm.com/cpp-callback-benchmark.html

또한 C++11이나 C#에 이르러서는 어나니머스 펑션(비슷한 말로 델리게이트, 람다함수 등등..)마저 사용할 수 있기 때문에 구현이 매우 편해집니다. 위에 링크한 위키백과 페이지에 예제들이 나와있으므로 참고하시면 좋겠네요. C#에서는 정말 많이 쓰입니다.

그럼에도 불구하고 여전히 전통적인 콜백을 사용해야 할 경우도 많은데 제일 흔한 이유가 환경상의 제약이지요. 전형적인 C스타일 라이브러리를 제공해야 한다든지, 현재 가져다 쓰고 있는 라이브러리가 콜백 함수 포인터를 요구한다든지 하면 어쩔 수 없지요. 아니면 스테이트 관리가 불필요한 경우 콜백 형태가 보기에 제일 직관적인 경우도 많고 이런 경우 굳이 더 복잡해보이는 방법을 쓸 필요도 없겠죠.

--

vi08의 이미지

상태 관리라 함은 FSM 같은 걸 말씀하시는 건가요;?

mirheekl의 이미지

말 그대로 아무거나 다 가능한 겁니다. 특정 모델을 의미하는 것이 아닙니다.

본문 주제에 관해선 그냥 추상적인 대상을 생각하시는게 편하고 굳이 뭔가 명칭이 정해진 것에만 한정지어 생각하실 필요는 없습니다. 대상을 명기하는 쪽이 더 이해하기 편하시면 상관은 없는데, 특정 개념에만 한정지어 용도를 생각하셔선 안된다는 얘기.

--

neocoin의 이미지

지금 잘 공감이 안가시면 조금 더 큰 규모의 어플리케이션을 작성해보세요.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <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].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <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].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <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].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <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].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.