6.メソッド
2006.10.18 株式会社四次元データ 西谷太郎
- 6.1. メソッドとは
- 6.2. 内部で行っていること
- 6.3. オーバーローディング
6.1. メソッドとは
メソッドとはクラスまたはインスタンスのもつ機能や操作のことです。メソッドがすることは、
- 値を受け取る。(この値を「引数(ひきすう)」と呼ぶ)
- 受け取った値を基に何らかの処理を行う。
- 処理の結果の値を返す。(この値を「返り値」または「戻り値」と呼ぶ)
メソッドの宣言は次の通り。
修飾子 返り値の型 メソッド名(データ型1 引数名1,データ型2 引数名2, ・・・) { メソッド内部の処理 }
修飾子はフィールドと同じく、public、private などをとります。
引数は、変数と同じようにデータ型と識別子(引数名)を宣言します。引数の個数は任意で、無くてもかまいません。引数を利用することで、メソッドを呼び出すときにメソッドに値を渡すことが可能になるのです。
返り値の型には、メソッドから呼び出し元に返すことのできるデータの型をクラス名もしくはプリミティブ型の型名で指定します。返り値が無いことを示す void を指定することも可能です。
それでは実際にメソッドを実装してみましょう。ここでは、5章で宣言したインスタンス変数 name の値を取り出すための getName メソッドと、その値を設定するための setName メソッドを実装することにします。
public class Human { private String name = null; private int age = -1; public String getName() { return name; } public void setName(String name) { this.name = name; } }
さらに、getAge、setAge、そしてその人の名前と年齢を文字列として一度に返すtoString()も実装しておきます。
public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String toString() { return "名前は" + name + "さんです。年は" + age + "歳です。"; }
6.2. 内部で行っていること
setName(String name) メソッドは、String 型の引数を name という引数名で受け取り、自身のインスタンスの変数 name に渡された引数の値を代入しています。
this.name の this. は「このインスタンスの」といった意味であり、このインスタンスの変数 name を指しています。引数で渡されてきた name と明確に区別するために、this. と指定しているわけです。
このメソッドはインスタンス変数に値をセットすることが目的なので、返り値は特にありません。従って、返り値が無いことを示す void が返り値の型に指定されているわけです。
次に getName() メソッドですが、このメソッドの目的はインスタンスに設定されている name の値を返すことです。特に引数を受け取る必要が無いので、引数は受け取らないようになっています。
一方で、String 型の name の値を返す必要があるので、返り値の型として String が指定されているわけです。
注意!
返り値の型の指定で void 型以外を指定したときは、メソッド内の処理で必ず指定した型の値を返さなくてはなりません。型が違ったり値を返さないとコンパイルエラーになります。
6.3. オーバーローディング
ここでは使用していませんが、オブジェクト指向においてポリモーフィズムの実現に重要な役割を担っているオーバーローディングについても簡単に説明しておきましょう。
オーバーローディングとは同じ名前で引数の数や変数型の異なるメソッドを複数定義することです。メソッドが呼び出されるときに、引数に応じてその内の1つが選択されます。
先ほど使ったgetName()を例に見てみましょう。
public String getName() { //…(ア) メソッド内処理 A } public String getName(int a, boolean b) { //…(イ) メソッド内処理 B }
同じクラスの中で上のように2つのメソッドを定義したとします。
getName();
の様に呼ぶと、引数が無いので自動的に(ア)が選ばれ、メソッド内処理 A が実行されます。
同様に、
getName(3, false);
の様に呼ぶと、第一引数が int 型、第二引数が boolean 型であるため、自動的に(イ)が選ばれ、メソッド内処理 B が実行されます。
この様に、同じ名前で呼び出しても引数の違いによって違うものが呼ばれるようにメソッドを定義することを、オーバーローディングといいます。
オーバーローディングの際に守らなければならないルールがあります。メソッド名と引数の型の並びの組み合わせ(正確には、メソッド名、引数の型、引数の数、引数の並び順)をシグネチャと呼びますが、このシグネチャが同じであるメソッドは、たとえ他の要素(返り値、アクセスレベル、引数名、throws節)が違っていても同時に定義することができません。従って同名のメソッドを定義するときには、シグネチャの内メソッド名以外(引数の型、数、並び順)のどれかを変えなければなりません。
例えば、
methodA(int a, boolean b) methodA(boolean b, int a)
なら、並び順が違うので定義できます。
しかし、
methodA(int a, boolean b) methodA(int c, boolean d)
は、引数名が違うだけで、メソッド名、引数の型、数、並び順すべて同じですのでコンパイルエラーになります。
オーバーローディングを使うと、似たような機能だが扱う引数の型が違う、といった場合にわざわざ別の名前のメソッドを作らずに済むなど、プログラムの柔軟性が向上します。