メソッド (計算機科学)
例えばnewを実行したとき、別のクラスオブジェクトに属するインスタンスオブジェクトを返すようにすることができる。C++のようにnewが演算子でありながら、クラスメソッド (静的メンバー関数) としてnewを定義できる言語もある。
クラスがオブジェクトになっている言語の場合、インスタンスもクラスも同じオブジェクトとして扱われるため、インスタンスメソッドとクラスメソッドでメッセージの送り方に区別はない。インスタンスメソッドの代わりにクラスメソッドを呼び出すことも、クラスメソッドの代わりにインスタンスメソッドを呼び出すこともできる。どちらのメソッドを呼び出すかは、メッセージを送った変数にインスタンスとクラスのうち、どちらのオブジェクトを代入していたかで決まる。
多くの言語ではインスタンスメソッドとクラスメソッドは同じシグネチャ (signature: 名前と引数) を定義できる。SmalltalkやObjective-Cなどメッセージが存在する言語ではメソッドの多重定義ができないため一見無理なように見えるが、メソッドが所属するオブジェクトがインスタンスとクラスで異なるため、同一のシグネチャでインスタンスメソッドとクラスメソッドを定義することができる。
このためメンバー関数型の言語と違いメッセージとメソッドの分離を強く意識しておく必要がある。
メソッドと通常の関数の違いは主にインスタンス内部へのアクセスの有無である。クラスに所属するフィールドおよびメソッドにはそれぞれアクセシビリティ(アクセスレベル)を設定することができ、アクセス権がないコード領域からは参照したり呼び出したりすることができない。この機能は通常カプセル化と呼ばれており、クラス定義の抽象化に貢献する。また呼び出し時に操作の対象となるインスタンス (レシーバ) を this や self といったキーワード(予約語)、あるいはメソッドに渡された引数によって参照することができる。 C++ではクラスに属さない関数である大域関数(グローバル関数あるいはフリー関数)と対比されることがある。
またメソッドはサブクラス化の際にオーバーライドされることがあり、実際に発生する動作(振る舞い)がレシーバに依存するという特徴を持つ。これを多態性(ポリモーフィズム)と呼ぶ。
統一モデリング言語 (UML) ではメソッドのことを操作 (operation) と呼ぶ。
Javaで記述したインスタンスメソッドと静的メソッド(クラスメソッド)の例を示す。Java では static 修飾子がついたメソッドが静的メソッドであり、ついていなければインスタンスメソッドである。
Smalltalk同様インスタンスメソッドを呼び出すには、まずコンストラクタを呼び出してインスタンスを生成しなければならない:
上記の例は、Smalltalkの例におけるインスタンスオブジェクトの生成と同様に動作する。C++の表記を踏襲したJavaでは、new演算子によってインスタンスを生成する。
インスタンスメソッドを呼び出すには次のように記述する:
上記の例は、Smalltalkの例におけるインスタンスメソッドの呼び出しと同様に動作する。
クラスメソッドを呼び出すには次のように記述する:
上記の例は、Rubyの例における直接クラス名を指定したクラスメソッドの呼び出しと同様に動作する。
Javaではメタクラスとしてjava.