- ベストアンサー
関数とメソッドの違い
初歩的な質問なのですが、 関数とメソッドの違いが分からず悩んでいます。 書籍や人によって、 関数とメソッドは同じ物として書いている物もあれば、 メソッドはクラスに関連付いた関数としていたり、 クラスでもpublic関数だけとか、 引数のある物がメソッド、 逆に無い物がメソッド等々…で、 どれが正しいのか良く分からないのです。 関数とメソッドの違いを教えていただけますよう、 お願いいたします。
- みんなの回答 (14)
- 専門家の回答
質問者が選んだベストアンサー
正解だけ先に言っておきましょう。オブジェクト指向での定義は 「メソッドとは、オブジェクトに送られてきたメッセージを処理するモノ」 「関数とは、メソッドの実装」 ついでに、 「メッセージとは、オブジェクトに何かしらお願いするために送られるモノ」 です。メッセージとメソッドと関数は明確に違うのですよ。 上記の通りなんですが、質問の文について、なにが正しいか、という解答は「文脈による」としか言いよ うが無いんです。 解説書の一部分だけ抜き出して考えるのは非常に危険な行為です。 文脈を色々変えてみます。例えばオブジェクト指向の話をしているとしたら、 >1. 関数とメソッドは同じ物として書いている物もあれば、 バツ。意味的に全く異なります。 '\0'と""とNULLと0くらい違います。等価なんていってしまったら石が飛びます。(私が投げます:-p) > 2.メソッドはクラスに関連付いた関数としていたり、 サンカク。C++での実装はそうでしょうが、オブジェクト指向を考える上で、その考え方は危険です。 > 3.クラスでもpublic関数だけとか、 > 引数のある物がメソッド、 > 逆に無い物がメソッド等々…で、 バツ。引数の数でメソッドで無くなる?そんなバカな! 例えprivateでもメソッドですよ。 オブジェクト指向言語C++のことを考えよう!という文脈ならば、 1.サンカク。実装は確かにそうなってます。ですが、上記の通り意味的に違うんです。 2.○。C++において、メソッドは「クラスに関連ついた関数」として実装されてます。 3.そんなわけないでしょう。 オブジェクト指向?なにそれ?構造体に関数がくっついただけでしょ?と乱暴極まりない文脈なら、 1.○。当然! 2.なにいってるの? 3.サブルーチンとファンクションの違いだ! と、文脈で全然変わるんですよ。これに関しては、本一冊だけだとなかなか気付きにくいです。 是非とも多数の本を読み比べることをお勧めします。
その他の回答 (13)
- ency
- ベストアンサー率39% (93/238)
ちなみに、メソッドの実装は、必ずしも関数コールである必要はありません。 C++ や Java の実装がそうなっているというだけの話で、それ以外の実装になっている言語もあるでしょう。 # 実装レベルの話は、C++ と Java の話しか知らないものでして。。。 # たとえば、Smalltalk とか Objective-C とか Ruby なんて言語は # どうなんでしょうか。 …と、なんだか結局のところ、jacta さんと同じことを繰り返してるような気がしてきました。。。 # No5 あたりで。
- ency
- ベストアンサー率39% (93/238)
No11 ency です。 ちょっと補足しておきます。 オブジェクト指向は、あるクラスのインスタンスを必要なときに動的に生成できるわけで、その各インスタンスに対して個別に何か処理をさせるのがメソッドなわけで。。。 ただ、実は C でも似たようなことは普通にやっているわけで。。。 ------------------------------------------------ #define SIZE 10 FILE *fp1, *fp2; char buf[SIZE]; fp1 = fopen( "hoge1.txt", "r" ); fp2 = fopen( "hoge2.txt", "r" ); fgets( buf, SIZE, fp1 ); fgets( buf, SIZE, fp2 ); ------------------------------------------------ たとえば、これをこんなふうに書替えれば、なんとなくオブジェクト指向っぽくなりませんかねぇ? (注)こんな言語はありません。 ------------------------------------------------ #define SIZE 10 FILE *fp1, *fp2; char buf[SIZE]; fp1 = new FILE( "hoge1.txt", "r" ); fp2 = new FILE( "hoge2.txt", "r" ); fp1.fgets( buf, SIZE ); fp2.fgets( buf, SIZE ); ------------------------------------------------ ま、fopen() が new FILE になってオブジェクト生成っぽくなっているところは置いといて、その下。。。 最後の引数を、関数の前にもっていって変数と関数をドットでつないだだけ。。。 ま、メソッドなんて、乱暴な言い方をすればこんなものです。 あ、でも、これがすべてだと思わないでくださいね。 今後のオブジェクト指向の勉強にさしさわりがありますので。。。 あくまで、導入部分のイメージとしてとらえてください。 # しかも実装ベースの話なので、オブジェクト指向の本来の考え方とは # 違う部分もありますし。。。 # オブジェクト指向は、こんな実装ベースの話からスタートしているのではなく、 # もっと上位の概念というか、抽象的なところからスタートしている話です。 # ですので、メソッドと関数も、考えているレベルというかレイヤというかが # 違っているわけですね。 # 外部設計レベルの話がメソッドであるとするならば、それに対する実装を # 設計する内部設計レベルの話が関数ということになりますかねぇ。。。 # だから、本来、同じとか違うとかいうような比較は、あまり意味がないのかも # しれません。 それにしても、こう考えると、メソッドを関数コールで実装している言語がある理由もなんとなくわかりませんか?
- ency
- ベストアンサー率39% (93/238)
関数とメソッド、参照とポインタ…議論が平行線になる話題ですね。 私の理解としては「メソッドの実装として関数コールで機能を実現している言語がある」というところですね。 C++ では、メソッド相当の機能を「メンバ関数」と呼んでいるだけだと思っています。 Java のメソッドも、内部では関数コールで実現しているだけだと思いましたが違いましたっけ? ま、このせいで C++ や Java は純正オブジェクト指向として認めない人たちもいると聞いたことがあります。 で、私の結論としましては次のとおりです。 1. メソッドはオブジェクトに対するメッセージ送信に対する応答。 2. メソッドの実装方法の一つとして関数コールで実現している言語がある。 もっと乱暴な言い方をすれば、「メソッド=関数」という理解でとりあえずは良いのではないでしょうか。 特に C からオブジェクト指向に移行する人たちは、まずはこの理解で良いと思います。 結局「なんだ、メソッドって関数コールじゃん!」っていう結論になることが多いようです。 # 「メッセージを送信して…」などという言葉があると、「スレッドが変わるのか?」 # などという誤解をする人たちもいるようなので。。。
お礼
ご返答ありがとうございます。 皆様方のご意見とても為になりました。
- jacta
- ベストアンサー率26% (845/3158)
> 元々メソッド(method)というコトバはSmalltalkで用いられたものではなかったかしら。 歴史的経緯はどうであれ、SmalltalkでもJavaでもC#でも、そこで使われている「メソッド」はC/C++から見れば他言語の概念に過ぎません。 #7 の回答のように、その言葉を使っている人と、今自分が扱っているものから判断するしかないと思います。 実際、FA機器を扱ったりしていると、顧客が使う「メソッド」は生産手法のことだったりするわけで、そこで開発するアプリケーションでもやはり「メソッド=生産手法」になるわけです。 というわけで、C/C++とは直接関係のない用語の定義を一意に定めることはできないと思います。
お礼
ご返答ありがとうございます。 皆様方のご意見とても為になりました。
- επιστημη(@episteme)
- ベストアンサー率46% (546/1184)
> 結局のところ、どなたのご意見が正しいのでしょうか。 元々メソッド(method)というコトバはSmalltalkで用いられたものではなかったかしら。 意味は「オブジェクトに送られたメッセージに対する反応」 であったはず。 だとすればメソッドはオブジェクト(レシーバ)を必要とするわけで(クラス・メソッドは例外)、そうでないものは関数と呼んで差し支えないのでは。 そんなわけで #1 が常識的なとこではないかと。
お礼
ご返答ありがとうございます。 皆様方のご意見とても為になりました。
- jacta
- ベストアンサー率26% (845/3158)
> だとすると、C#におけるメソッドはどうなんでしょう。ただのメンバ関数をメソッドと'称している'に過ぎないように思えますが。 これはその通りだと思います。 C++の「オブジェクト」というのも、オブジェクト指向でいうところの「オブジェクト」と必ずしも等価でないのと同様、C#における「メソッド」もその言語内のローカルな定義に過ぎないのでしょう。
- nitscape
- ベストアンサー率30% (275/909)
色々な回答があり情報が錯綜していますが。。。「関数=メソッド」と考えていいと思います。 まずC++の言語仕様には「メソッド」はないと思います(私自身仕様を把握しているわけではないので自信はありません、ないと思います)。 そのためC++(の仕様)において「メソッドと関数の違いは?」という質問への正確な回答はないと思います。 とは言うもののC++に関しても様々な場面で「メソッド」という言葉が使われています。 Visual C++で「メソッド」という言葉が使われている場面もあります。COM(ActiveX)で外部から操作できる関数を「メソッド」と呼びます(同じように外部から参照や操作できる変数は"プロパティ"と呼びます)。これはマイクロソフトなどが使っているC++での「メソッド」という言葉です。 またC++以外の言語を使っていて新しくC++を始めた人などは「メソッド=関数」という意味合いで使っていることもあります。また「クラスのメンバー関数=メソッド」として扱っている人もいます。これらは多くの場合上で述べたマイクロソフトの"メソッド"という言葉とは違う意味で使っています。 つまり「メソッド」という言葉はきちんとした定義がない(?)ためにその言葉を使っている人によって意味合いが違っています。「メソッド」という言葉に出会ったらその時々でその意味を判断する必要があると思います。しかしどの場合にも"メソッド"が"関数"の1種であることには変わりはないので「メソッド=関数」と考えていいと思います。
お礼
ご返答ありがとうございます。 私としてはクラスのメンバ関数がメソッドの事で、 メンバ関数と言う言い回しは、C/C++の方言だと考えていたのですが、 改めて調べ直すと、他の方々のご返答のように、 人によってまちまちなので、何が正しいのか確信がもてなくなりました。 多くの方々から、ご返答を頂けましてありがたいのですが、 結局のところ、どなたのご意見が正しいのでしょうか。
- επιστημη(@episteme)
- ベストアンサー率46% (546/1184)
#5> 「標準出力というオブジェクトに、putsというメッセージを送ると、文字列が出力されるというメソッドが実行される」といった具合に、メンバ関数とは直結しません。 なるほど、「オブジェクトに送られたメッセージに対する反応」がメソッドで、その実現手段の一つがメンバ関数だと(それでいいですか?)。 だとすると、C#におけるメソッドはどうなんでしょう。ただのメンバ関数をメソッドと'称している'に過ぎないように思えますが。
- jacta
- ベストアンサー率26% (845/3158)
> ? では メソッド と メンバ関数 の違いは? C/C++では、メソッドは言語仕様にないので一般的な解釈をせざるを得ないと思います。 「標準出力というオブジェクトに、putsというメッセージを送ると、文字列が出力されるというメソッドが実行される」といった具合に、メンバ関数とは直結しません。 もっと極端な例では、「タイマというオブジェクトに、レジスタへの書き込みというメッセージを送ることで、カウントアップ開始というメソッドが(ハード的に)実行される」というのもあるでしょう。 メンバ関数はメソッドを実現する上で便利な機能ではありますが、メンバ関数を使えばメソッドになるわけでもなければ、メソッドはメンバ関数でしか実現できないものではないと思いますが、いかがでしょう?
- επιστημη(@episteme)
- ベストアンサー率46% (546/1184)
#2> CやC++には「メソッド」というものはありません。C++にあるのは「メンバ関数」であってメソッドではありません。 ? では メソッド と メンバ関数 の違いは? クラスに束縛された関数を Java/C#ではメソッド、C++ではメンバ関数 と呼んでいる だけのことでは?
お礼
ご返答ありがとうございます。 私としてはクラスのメンバ関数がメソッドの事で、 メンバ関数と言う言い回しは、C/C++の方言だと考えていたのですが、 改めて調べ直すと、他の方々のご返答のように、 人によってまちまちなので、何が正しいのか確信がもてなくなりました。 多くの方々から、ご返答を頂けましてありがたいのですが、 結局のところ、どなたのご意見が正しいのでしょうか。
- 1
- 2
お礼
ご返答ありがとうございます。 うーん、文脈で意味する所が変わってしまうのか… 単純な事かと思っていましたが、 意外と複雑な事だったようで。 皆様方のご意見とても為になりました。