今回やること
メソッドは、処理をまとめて名前を付けたものです。チケットの合計金額を求める処理を使って、引数・戻り値・void・オーバーロードを順に確認します。
前提: Java入門 #10 - 配列までの変数、条件分岐、繰り返しを理解していること。
単価と枚数を渡す → calculateTotalが計算する → 合計金額が戻る
| 部分 | 役割 |
|---|---|
| メソッド名 | 処理の目的を表す |
| 引数 | 呼び出し元から受け取る値 |
| 戻り値 | 計算結果として呼び出し元へ返す値 |
| 戻り値の型 | どの型を返すかを宣言する |
この回のメソッドにはstaticを付けます。mainもstaticメソッドなので、まだオブジェクトを作らずに直接呼び出せる形にするためです。クラスとオブジェクトを学んだ後は、各オブジェクトの状態を使うインスタンスメソッドも作ります。
処理へ具体的な名前を付けると、呼び出し側を読んだだけでも目的を追いやすくなります。
1. 引数を受け取る
次のメソッドは、unitPriceとcountという2つのintを受け取ります。
static int calculateTotal(int unitPrice, int count) {
return unitPrice * count;
}
メソッド定義のunitPriceとcountを仮引数、呼び出し時の1200と3を実引数と呼びます。
int total = calculateTotal(1200, 3);
引数は定義した順番と型に合わせます。この呼び出しではunitPriceが1200、countが3です。
2. returnで結果を返す
戻り値の型がintなので、returnもintの値を返します。呼び出し元は結果を変数に保存でき、その後の計算や表示に使えます。
int total = calculateTotal(1200, 3);
System.out.println(total);
表示するだけでなく値を返す形にすると、「計算」と「画面へどう見せるか」を分けられます。
3. voidで表示だけを行う
結果を返さないメソッドは、戻り値の型をvoidにします。
static void showTotal(int total) {
System.out.println("合計: " + total + "円");
}
showTotalは表示を行いますが、計算結果を返しません。int value = showTotal(3600);のようには使えません。
4. 引数違いのメソッドを用意する
同じ名前で引数の個数や型が違うメソッドを定義することを、オーバーロードと呼びます。割引額を受け取る形だけを追加します。
static int calculateTotal(int unitPrice, int count, int discount) {
return unitPrice * count - discount;
}
引数2個なら通常計算、3個なら割引計算が選ばれます。戻り値の型だけを変えてもオーバーロードにはなりません。
完成コードを動かす
MethodDemo.javaとして保存します。
public class MethodDemo {
static int calculateTotal(int unitPrice, int count) {
return unitPrice * count;
}
static int calculateTotal(int unitPrice, int count, int discount) {
return unitPrice * count - discount;
}
static void showTotal(String label, int total) {
System.out.println(label + ": " + total + "円");
}
public static void main(String[] args) {
int regular = calculateTotal(1200, 3);
int discounted = calculateTotal(1200, 3, 500);
showTotal("通常", regular);
showTotal("割引後", discounted);
}
}
javac MethodDemo.java
java MethodDemo
呼び出しの流れは次のとおりです。
| 呼び出し | 選ばれる定義 | 結果 |
|---|---|---|
calculateTotal(1200, 3) | 引数2個 | 3600 |
calculateTotal(1200, 3, 500) | 引数3個 | 3100 |
成功確認
通常: 3600円
割引後: 3100円
同じ計算式をmainへ2回書かず、メソッドの戻り値を表示用メソッドへ渡せていれば成功です。
mainには「どの順に処理するか」、各メソッドには「その処理をどう行うか」が分かれていることも確認します。
よくあるつまずき
returnの型が宣言と違う
static intならintを返します。値を返さない処理はvoidにします。
引数の順番を入れ替える
同じint同士だと、順番を間違えてもコンパイルできる場合があります。unitPrice、countのように役割が分かる名前を使います。
似たoverloadを増やしすぎる
引数の意味が判断しにくい定義を大量に作ると、呼び分けが難しくなります。今回は割引の有無という1つの違いだけにします。
練習
長方形の面積を返すcalculateArea(int width, int height)と、結果を表示するshowArea(int area)を作ってください。別題材として、引数と戻り値の役割を説明できれば完了です。
次のステップ
Java入門 #12 - クラスとオブジェクトで、データとメソッドを一つの型へまとめます。