メソッド
メソッドとは
何か工作をする際に、色々な部品を組み合わせて作ることがあると思います。プログラムも部品が組み合わさって構成されています。プログラムの部品の中で、最も小さい単位がメソッドになります。
メソッド①
3人分の身長・体重・年齢を読み込んで、それぞれの最大値を表示するプログラムを作りましょう。各データを配列で扱ってみましょう。
//MaxHwa.java
//3人の身長・体重・年齢の最大値を求めて表示
import java.util.Scanner;
public class MaxHwa {
public static void main(String[] args){
Scanner stdIn = new Scanner(System.in);
int[] height = new int[3];
int[] weight = new int[3];
int[] age = new int[3];
for(int i = 0; i < 3; i++){
System.out.print("[" + (i + 1) + "]");
System.out.print("身長:"); height[i] = stdIn.nextInt();
System.out.print("体重:"); weight[i] = stdIn.nextInt();
System.out.print("年齢:"); age[i] = stdIn.nextInt();
}
//身長の最大値を求める
int maxHeight = height[0];
if(height[1] > maxHeight) maxHeight = height[1];
if(height[2] > maxHeight) maxHeight = height[2];
//体重の最大値を求める
int maxWeight = weight[0];
if(weight[1] > maxWeight) maxWeight = weight[1];
if(weight[2] > maxWeight) maxWeight = weight[2];
//年齢の最大値を求める
int maxAge = age[0];
if(age[1] > maxAge) maxAge = age[1];
if(age[2] > maxAge) maxAge = age[2];
System.out.println("身長の最大値は" + maxHeight + "です。");
System.out.println("体重の最大値は" + maxWeight + "です。");
System.out.println("年齢の最大値は" + maxAge + "です。");
stdIn.close();
}
}
このプログラムを以下の方針に従って改良していきましょう。
- ひとまとまりの手続きは、1つの部品としてまとめる
プログラムの部品を実現するのが、メソッド(method)です。本プログラムの改良に必要なのは、「3つのint型の値を渡したら、その最大値を求めて返す」という部品です。
処理を行うメソッドを使っていくために以下に示す2つのことを学びましょう。
- メソッドの作り方…メソッドの宣言
- メソッドの使い方…メソッドの呼び出し
メソッドの宣言
まずは、メソッドの作り方です。以下に示すのは、「3つのint型の整数値を受け取って、その最大値を求めるメソッド」のメソッド宣言(method declaration)です。
static int max(int a, int b, int c){
int max = a;
if(b > max) max = b;
if(c > max) max = c;
return max;
}
まずは、各部の概略を理解しましょう。
メソッド頭部(method header)
プログラムの部品であるメソッドの名前と仕様を記した部分です。メソッド頭部という名前ですが、意味合いとしては顔に近いです。
- 返却型(return type)…自分を呼び出した部品=メソッドに戻す値である返却値の型です。本メソッドの場合、返却するのは最大値ですから、その型であるintとなっています。
- メソッド名(method type)…メソッドの名前です。メソッドは、名前を元に他の部品から呼び出されます。
- 仮引数並び(formal parameter list)…メソッドは、補助的な指示を受け取れます。受け取るための変数である仮引数を()の中で宣言します。複数の仮引数を受け取る場合は、コンマで区切ります。
メソッド本体(method body)
メソッドの本体は、ブロック({}で囲まれた0個以上の文の集合)です。メソッドmaxの本体では、maxという変数が宣言されています。メソッド中でのみ利用する変数は、そのメソッド中で宣言、利用するのが原則になります。
先ほどのプログラムをメソッドを用いて改良したのが以下になります。
//MaxHwaMethod.java
//3人の身長・体重・年齢の最大値を求めて表示(メソッド)
import java.util.Scanner;
public class MaxHwaMethod {
static int max(int a, int b, int c){
int max = a;
if(b > max) max = b;
if(c > max) max = c;
return max;
}
public static void main(String[] args){
Scanner stdIn = new Scanner(System.in);
int[] height = new int[3];
int[] weight = new int[3];
int[] age = new int[3];
for(int i = 0; i < 3; i++){
System.out.print("[" + (i + 1) + "]");
System.out.print("身長:"); height[i] = stdIn.nextInt();
System.out.print("体重:"); weight[i] = stdIn.nextInt();
System.out.print("年齢:"); age[i] = stdIn.nextInt();
}
//身長の最大値を求める
int maxHeight = max(height[0], height[1], height[2]);
//体重の最大値を求める
int maxWeight = max(weight[0], weight[1], weight[2]);
//年齢の最大値を求める
int maxAge = max(age[0], age[1], age[2]);
System.out.println("身長の最大値は" + maxHeight + "です。");
System.out.println("体重の最大値は" + maxWeight + "です。");
System.out.println("年齢の最大値は" + maxAge + "です。");
stdIn.close();
}
}
メソッド呼び出し
部品であるメソッドを利用することを「メソッド呼び出す」といいます。このプログラムで、メソッドmaxを呼び出しているのが、以下の部分です。
//身長の最大値を求める
int maxHeight = max(height[0], height[1], height[2]);
//体重の最大値を求める
int maxWeight = max(weight[0], weight[1], weight[2]);
//年齢の最大値を求める
int maxAge = max(age[0], age[1], age[2]);
身長・体重・年齢の最大値を求めるために、メソッドmaxを3回呼び出しています。メソッド呼び出しには、メソッド名後ろに( )を付けて行います。この( )は、メソッド呼び出し演算子(method invocation operator)です。メソッドに対する補助的な指示として与える実引数(actual argument)は、コンマで区切って( )の中に与えます。
メソッド呼び出しが行われると、プログラムの流れはそのメソッドに一気に移ります。呼び出されたメソッドでは、仮引数用の変数が生成されると同時に、実引数の値で初期化されます。初期化が終了すると、メソッド本体が実行されます。メソッドmaxは呼び出し元へ、最大値を返却します。それを行うのが以下の文です。
return max;
この文をreturn文と呼びます。これが実行されると、プログラムの流れは呼び出し元に戻ります。
return文
メソッドの実行を終了して、プログラムの流れを呼び出し元へと戻すreturn文は、返却値を指定するための式は省略できます。
3値の最大値求めるメソッドmaxを作ったので、そのメソッドを使ったプログラムを作ってみましょう。
//Max3Method.java
//3つの整数値の最大値を求める(メソッド)
import java.util.Scanner;
public class Max3Method {
static int max(int a, int b, int c){
int max = a;
if(b > max) max = b;
if(c > max) max = c;
return max;
}
public static void main(String[] args){
Scanner stdIn = new Scanner(System.in);
System.out.print("整数a:"); int a = stdIn.nextInt();
System.out.print("整数b:"); int b = stdIn.nextInt();
System.out.print("整数c:"); int c = stdIn.nextInt();
System.out.println("最大値は" + max(a, b, c) + "です。");
stdIn.close();
}
}
このプログラムでは、メソッドに渡している実引数すべて変数です。変数だけでなく、整数リテラルなどの定数を渡すこともできます。
値渡し
べき乗(xの2乗)を求めるメソッドを作成しましょう。xがdouble型でnがint型であれば、プログラムは以下のようになります。
//Power.java
//べき乗をもとめる
import java.util.Scanner;
public class Power {
//xのn乗を返す
static double power(double x, int n){
double tmp = 1.0;
for(int i = 1; i <= n; i++)
tmp *= x;
return tmp;
}
public static void main(String[] args){
Scanner stdIn = new Scanner(System.in);
System.out.println("aのb乗を求めます。");
System.out.print("実数a:"); double a = stdIn.nextDouble();
System.out.print("整数b:"); int b = stdIn.nextInt();
System.out.println(a + "の" + b + "乗は" + power(a, b) + "です。" );
stdIn.close();
}
}
nが整数ですから、xをn回掛け合わせた値がxのn乗です。メソッドをpowerでは、1.0で初期化された変数tmpに対して、xの値をn回掛けています。for文が終了した時に最終的な値がtmpに渡されます。このように引数として値がやり取りされるメカニズムを値渡し(pass by value)と呼ばれます。