ここから本文です

関数、メソッドの違いについて メソッドはオブジェクトに付随するとするとイメ...

nag********さん

2018/10/818:13:38

関数、メソッドの違いについて

メソッドはオブジェクトに付随するとするとイメージとしては
オブジェクト=りんご
メソッド=食べる
関数=存在する
のような認識で良いのでしょうか?

つまり関数はどのオブジェクトにも適用できるが、メソッドは一部のオブジェクト(今回はりんご)という理解をしました。
つまり関数は一般的な処理のことを指すが、メソッドは限定されているものであり、
Aというメソッドは関数である。
しかし関数は限定されない限り(モジュールのオブジェクトの中)メソッドとは表記されない。
という理解でよろしいでしょうか?

この質問は、活躍中のチエリアン・専門家に回答をリクエストしました。

閲覧数:
54
回答数:
4

違反報告

ベストアンサーに選ばれた回答

プロフィール画像

カテゴリマスター

nor********さん

2018/10/1100:30:15

そこいらへんは面倒くさいです。

C言語が値を返さないものも含めてサブルーチンを「関数」としました。
C言語だと
FILE *fp;
fp = fopen( filename,mode)
でオープンに失敗するとNULLが返りますが、そこは置いておくと
fpを使って
fgets
fputs
fscanf
fprintf
fseek
などなどが操作できます(ファイルによってはfseekできないものもあります。オープンする時のモードにもよりますし、開く対象自体にも)

ここいらへんと抽象データ型(キューとかリストとか)も合わせて、データと処理手続きを合体させたのがC++になると思います。
実際上記のC言語の例で言えばFILEというクラス(設計図)から実際のオブジェクト(インスタンス)を生成して、各関数を呼び出すことで処理を行うようにイメージできます。
Javaなどでいうメソッドと同様です。C++はC言語由来の「メンバー関数」という呼び名を使いますが、やっていることや機能にあまり違いはありません。
C言語では同じ関数名は使えませんでしたが、C++のメンバー関数やJava、C#のメソッドは同じ名前でも構いませんが。
あとメソッドでついてインスタンスメソッドとクラスメソッドという性格が違うものがあります。
インスタンスメソッドは生成したインスタンス(オブジェクト)ごとに適用されます。
C言語ならfputs( "文字列", fp)のファイルポインタごとに呼び出す感じ。
クラスメソッドはそうしたインスタンスごとでなく、クラス共通にあるメソッドでC言語の一般的な関数に近い感じです。

ただ、最近「関数型プログラミング」という考えが着目されています。考え方自体はLispという言語あたりが最初で1960年ごろからなので古株ではありますが。

JavaやC#も最近のバージョンでは、これからの発想を取り入れています。
「C# ラムダ式」「Java ラムダ式」などで検索してみるとヒットするはずです。

自分の印象からするとCがサブルーチンをひっくるめて「関数」としたのはあまり適当ではなかったように思います。

それとオブジェクト指向プログラミングのメソッド概念とがごっちゃになったのと、関数本来の意味であった「引数に指定した変数の状態を変化させない」というのを平然と破ってしまった(scanfなどは引数に入力値を引き渡します)こともあって非常に分かりにくくなった気がしています。

自分としては、あまりここで悩んでも仕方がないと思います。
学ぶ言語によって呼び方や使い方は違ってきますし、C言語のような手続き型、Java、C#のようなオブジェクト指向言語、Lispやhaskellのような関数型言語それぞれその世界の流儀に合わせて勉強していくしかないでしょうね。
ある程度身につけてから他言語を勉強し始めると、共通する考え方もあるし、違いも見えてくるはずです。

# Ruby、Pythonも忘れていません。
# PHPもあるでしょう

この回答は投票によってベストアンサーに選ばれました!

ベストアンサー以外の回答

1〜3件/3件中

並び替え:回答日時の
新しい順
|古い順

プロフィール画像

カテゴリマスター

nob********さん

2018/10/819:50:48

メソッドはオブジェクト指向プログラミングで新たに作られた名前で、オブジェクト指向プログラミングではないプログラムの関数に相当します。従って、関数は単独ですが、メソッドはクラスに所属します。

プロフィール画像

カテゴリマスター

aki********さん

2018/10/818:33:20

関数は道具で、メソッドは能力みたいな感じですかね。

関数は、対象とは別の存在で、対象に対して使う事で対象を加工したりします。
素材に合わせた道具をきちんと選ぶ必要があります。
道具による処理を中心とした考え方です。

それに対してオブジェクト指向は、データの方を中心とした考え方で、
データ自身に自分を処理する方法をもたせています。
オブジェクトの振る舞いとも言います。
○○をしたいと思った時に、そのデータにはどんな道具を使えば良いのか、
どんな方法で行うのかといったことはオブジェクト自身が知っているので、
ユーザーはオブジェクトに対して○○したいとだけ目的を言えば
あとはオブジェクト自身が自分に最適な方法で処理を行ってくれる便利な仕組みです。

プロフィール画像

カテゴリマスター

qui********さん

リクエストマッチ

2018/10/818:30:57

> 関数=存在する
いわんとすることがわかりませんが...


メソッドというのはJavaの用語で、クラス内に書かれた関数をメソッドと呼ぶ、というそれだけではないでしょうか?
C++なんかだとメソッドではなくメンバ関数と呼びます。
(他の言語でもメソッドと呼ぶものはあるでしょうけれど)

なにか話を勝手に難しくしている気がします。

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる