今回はクラスの部品の一つである「メソッド」の説明です。前半ではメソッドの概要と戻り値について、後半では引数について説明します。
メソッドとは
メソッドはクラスの部品の一つで操作を担当するものです。
変数がデータを保存する箱であるならば、メソッドは処理を入れる箱と考えることができます。処理を箱(メソッド)内に保存しておき、必要に応じて保存した処理を利用することができます。
メソッド内には演算や制御構文等の様々な処理を記述することができます。逆に、メソッド外では「制御構文」や「宣言済みの変数操作」等の処理はコンパイルエラーとなります。(下記例参照)
メソッド外で記述するとエラーになる例
1 2 3 4 5 6 |
class Test{ int a = 3 + 3; //エラーにならない a += 3; //エラー System.out.println(a); //エラー if(a > 3) a = 10; //エラー } |
メソッド定義と呼び出し
メソッドを定義もしくは呼び出しする際には「メソッド名」「戻り値の型(もしくはvoid)」「引数」等を記述する必要があります。(シグネチャとも呼ばれる)
下の図は変数の宣言および代入イメージと、メソッドの定義イメージの比較です。
イメージ図でもわかるとおり、メソッドは変数と比べ、構成する部品が多く、部品ごとのルールや特徴を覚える必要があります。
以下は、クラスの説明で利用したTaiyakiクラスです。このクラス内にはopen()メソッドが記述されています。Taiyakiクラスはコンパイルはできますが、main()メソッドをもっていないため実行はできません。
1 2 3 4 5 6 |
class Taiyaki{ String nakami ; void open(){ System.out.println("たい焼きの中身は" + nakami + "です"); } } |
メソッドを作成することをメソッド定義と表現します。以下はopen()メソッドの定義部分を抜き出したものです。メソッドは定義しただけでは処理を行うことができません。
1 2 3 |
void open(){ System.out.println("たい焼きの中身は" + nakami + "です") } |
メソッド内の処理を動作させるには、メソッドの呼び出しと呼ばれる記述を行う必要があります。メソッドの呼び出しはインスタンス変数を利用して呼び出すことになります。
メソッドの呼び出し | インスタンス変数名.メソッド名() ; |
---|---|
記述例 | taiyaki_anko.open() ; |
以下はクラスの説明記事で紹介した、open()メソッドを呼び出しているNumber25クラスです。
1 2 3 4 5 6 7 8 9 10 |
class Number25{ public static void main(String[] args){ //たい焼きクラスからインスタンス生成 Taiyaki taiyaki_anko = new Taiyaki(); //たい焼きクラスのフィールドにデータを保存 taiyaki_anko.nakami = "あんこ"; //たい焼きクラスのメソッドを利用 taiyaki_anko.open(); } } |
手順が複雑になりますが、メソッドを作成後、実行するには以下の手順が必要です。
- クラスを作成し、その中にメソッドを定義する
- 別のクラスで1で作成したクラスからインスタンスを生成する
- 2で作成したインスタンスを利用してメソッドを呼び出す
上記手順をクラス「Taiyaki」「Number25」で説明します。
- Taiyakiクラスを作成し、open()メソッドを定義する
- Number25クラスでTaiyakiクラスからインスタンス「taiyaki_anko」を生成する
- taiyaki_ankoインスタンスを利用してopen()メソッドを呼び出す
メソッド名
メソッドはイメージとしては処理を保存できる箱で、箱の名前であるメソッド名を定める必要があります。メソッド名は変数名と同じ識別子にあたるものなので、変数名と同じルールが適用されます。以下はメソッド名の規則の一例です。
- 頭文字に数値は使用できない
- 使用できる記号は「_」「$」のみ
- 予約語は使用できない(publicやvoidなど)
戻り値
戻り値は別名返り値とも呼び、メソッド内の処理を行った後、何かしらのデータを呼び出し元に渡す場合に記述します。但し、戻り値は必ず必要なものではなく、「戻り値あり」と「戻り値なし」があります。
戻り値なし
戻り値がない場合は、メソッド内は処理のみを記述し、メソッド定義には戻り値がないことを示す「void」を記述します。voidの記述を省略することはできません。
戻り値なしのメソッド定義 | void メソッド名(引数){ □処理 ; } |
---|---|
記述例 | void open(){ System.out.println(”表示”); } |
戻り値あり
戻り値がある場合はvoidではなく戻り値の型を記述します。また、戻り値と戻り値の型は同じである必要があります。また、戻り値はreturnの右に記述します。
戻り値ありのメソッド定義 | 戻り値の型 メソッド名(引数){ □処理 ; □return 戻り値 ; } |
---|---|
記述例 | String getSize(){ □String size = “大”; □return size ; } |
記述例では戻り値の型がStringとなっているため、returnの右にはString型のデータや変数を記述する必要があります。
戻り値は「メソッドを定義したクラス→[データ]→呼び出し元のクラス」という流れになります。
メソッドを実行した結果としてデータが取得できる為、そのデータを「変数に代入」「計算に利用」といったように利用ができます。
例えば、演算も演算結果を利用して演算に利用できます。下記の演算では「3と5を乗算した結果」と「2」を加算します。
int result = 3 * 5 + 2 ;
同じように、戻り値が数値であれば、以下のように計算や表示に利用できます。
int result = getNumber() + 2; //getNumber()からの戻り値と数値を加算する
System.out.println(getNumber()); //getNumber()の戻り値を表示する
メソッド サンプルプログラム
以下のプログラムを「Taiyaki.java※」という名前でworkフォルダ内に保存します。Taiyaki.javaはコンパイルおよび実行は必要ありません。
※すでにTaiyakiクラスを作成している場合は、追加のフィールドとメソッド部分を記述してください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
//たい焼きクラスの作成 class Taiyaki{ //たい焼きの中身 String nakami; //追加 たい焼きのサイズ String size = "中"; //たい焼きの中身を確認する void open(){ System.out.println("たい焼きの中身は" + nakami + "です"); } //追加 たい焼きのサイズをreturnする String getSize(){ return size; } } |
Taiyakiクラスを利用する以下のプログラムを「Number27.java」という名前でworkフォルダ内に保存します。保存が完了したら、コマンドプロンプトを起動し、コンパイルおよび実行を行ってみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 |
class Number27{ public static void main(String[] args){ Taiyaki taiyaki_siro = new Taiyaki(); taiyaki_siro.nakami = "白あん"; //戻り値のないメソッドを呼び出す taiyaki_siro.open(); System.out.print("たい焼きのサイズ:"); //戻り値のあるメソッドを呼び出し、 System.out.println(taiyaki_siro.getSize()); } } |
実行例
C:\work>javac Number27.java
C:\work>java Number27
たい焼きの中身は白あんです
たい焼きのサイズ:中
※実行例はコンパイルおよび実行までの例を表示しています。
メソッドと戻り値 復習問題
- 以下の説明で誤りの記述を選んでください。
- 解答群
- メソッドはクラス内の状態を担当する
- メソッドはクラス内の操作を担当する
- voidは記述を省略することはできない
- voidは戻り値がないことを示している
- メソッド名として利用するとコンパイルエラーとなる名前を選んでください。
- 解答群
- method
- getNumber
- 01getNumber
- getNumber01
- メソッド宣言が「double getNumber()」となっている場合、returnを記述する際にコンパイルエラーとなるものを選んでください。
- 解答群
return 5 ;
return 1.8;
return 3 * 2;
return false;
- お疲れ様でした。
まとめ
- メソッドは操作を担当する
- メソッド定義時および呼び出しには「戻り値の型(もしくはvoid)」「メソッド名」「引数」が必要となる
- 戻り値がない場合はvoidを記述し、省略は不可
- 戻り値がある場合は戻り値の型を記述する
- 基本的に制御構文や演算等の処理はメソッド内に記述する