メソッドの戻り値
呼び出し元からメソッドに値を渡すのとは逆に、メソッドから呼び出し元に値を返す方法も用意されています。 ここでは、その方法について学習していきましょう。
値を返すメソッド
メソッドは、その処理の結果得られた値を呼び出し元に返すことができます。 この値のことを戻り値(return value)と言います。
もう一度メソッド宣言の構文を見てください。
構文 : メソッド宣言(再掲)
static 戻り値の型 メソッド名(引数リスト){
文1
文2
...
return 式;
}
では、与えられた初項から末項までのすべての整数の和を求め、その結果を返すメソッドを作ってみましょう。 ただし、初項 ≦ 末項とします。 このメソッドは、次のように宣言できます。
static int sumUp(int m, int n){
int sum = 0;
for(int i = m; i <= n; i++){
sum += i;
}
return sum;
}
| 戻り値の型 | メソッド名 | 引数リスト |
|---|---|---|
| int | sumUp | int m, int n |
sumUpメソッドの引数は、int型のmとnとなっています。 例えば、「-2-1+0+1+2+3+4」を計算させる場合、呼び出し元から初項の-2と末項の4が渡されて、それぞれmとnに代入されることになります。
メソッド本体では、for文の初期化部でmを、繰り返し条件でnを使っています。 for文が終了した時点では、変数sumにはmからnまでの整数の和が代入されていることになります。
値を返すには、return文を使います。 構文中の「return 式;」の部分がそれです。 return文は、指定された式の値を呼び出し元に返すことができます。 sumUpメソッドでは、return文によって変数sumの値を返します。 変数sumはint型なので、sumUpメソッドの戻り値の型はintとなっているのです
構文 : return文
return 式;
メソッドは、return文を使って呼び出し元に値を返すことができる。
値を返すメソッドを呼び出す
sumUpメソッドを呼び出して、初項の-2から末項の4までの整数の和を計算し、その戻り値を表示するには次のように記述します。
int s;
...
s = sumUp(-2, 4);
System.out.println("-2から4までの和は" + s + "です。");
ここでは、実引数として-2と4を渡して呼び出しています。
メソッドが呼び出されると、メソッド本体の先頭から順に処理が行われていきます。 そして、return文が実行されると、指定された戻り値が呼び出し元に返されます。 sumUpメソッドでは、初項のmから末項のnまでの和が計算され、その結果が変数sumに格納されます。 最後にsumの値が、return文によって呼び出し元に返されます。
sumUp(-2, 4)という式の値は、return文によって返される戻り値の7であり、これがint型の変数sに代入されることになります。 この後は「System.out.println("-2から4までの和は" + s + "です。");」以下の処理が続きます。
値を返すメソッドを使ってみる
それでは、sumUpメソッドを試してみましょう。
MethodSample04.java
class MethodSample04 {
static int sumUp(int m, int n){
int sum = 0;
for(int i = m; i <= n; i++){
sum += i;
}
return sum;
}
public static void main(String[] args) {
int s;
s = sumUp(1, 10);
System.out.println("1から10までの和は" + s + "です。");
s = sumUp(-2, 4);
System.out.println("-2から4までの和は" + s + "です。");
s = sumUp(-5, 2);
System.out.println("-5から2までの和は" + s + "です。");
}
}
MethodSample04の実行結果
1から10までの和は55です。 -2から4までの和は7です。 -5から2までの和は-12です。
MethodSample04では、戻り値を一旦int型の変数sに代入してから、それを表示していますが、次のように戻り値を直接利用することもできます。
MethodSample04A.java
class MethodSample04A {
static int sumUp(int m, int n){
int sum = 0;
for(int i = m; i <= n; i++){
sum += i;
}
return sum;
}
public static void main(String[] args) {
System.out.println("1から10までの和は" + sumUp(1, 10) + "です。");
System.out.println("-2から4までの和は" + sumUp(-2, 4) + "です。");
System.out.println("-5から2までの和は" + sumUp(-5, 2) + "です。");
}
}
実行結果はMethodSample04と同じです。
値を返すメソッドの呼び出しは、式の中に直接書き込むことができる。
boolean型の値を返すメソッド
第7章でbreak文の学習をしたときのBreakSample01は、入力された正の整数が素数かどうかを判定するプログラムでした。 もう一度BreakSample01を見てください。
BreakSample01.java(再掲)
import java.io.*;
class BreakSample01 {
public static void main(String[] args) throws IOException{
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
System.out.println("正の整数を入力してください。");
int num = Integer.parseInt(br.readLine());
boolean prime = true; //素数かどうかを表すboolean型の変数。最初は素数に設定
for(int i = 2; i < num; i++){
if(num % i == 0){ //1と自分自身以外の数で割り切れたら素数ではない。
prime = false;
break;
}
}
if(num == 1) //1は自分自身以外の数で割り切れないが、素数ではない。
prime = false;
if(prime)
System.out.println("素数です。");
else
System.out.println("素数ではありません。");
}
}
BreakSample01の実行結果 1
正の整数を入力してください。 1 素数ではありません。
BreakSample01の実行結果 2
正の整数を入力してください。 3 素数です。
BreakSample01の実行結果 3
正の整数を入力してください。 6 素数ではありません。
次のMethodSample05は、素数かどうかを判定するメソッドを使って、BreakSample01を書き直したものです。
MethodSample05.java
import java.io.*;
class MethodSample05 {
static boolean isPrime(int num){
for(int i = 2; i < num; i++){
if(num % i == 0) //1と自分自身以外の数で割り切れたら素数ではない。
return false;
}
if(num == 1) //1は自分自身以外の数で割り切れないが、素数ではない。
return false;
return true;
}
public static void main(String[] args) throws IOException{
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
System.out.println("正の整数を入力してください。");
int n = Integer.parseInt(br.readLine());
if(isPrime(n))
System.out.println("素数です。");
else
System.out.println("素数ではありません。");
}
}
MethodSample05の実行結果は、BreakSample01と同じです。
isPrimeメソッドは、与えられた整数が素数であるかどうかを判定して、結果を返すメソッドです。
| 戻り値の型 | メソッド名 | 引数リスト |
|---|---|---|
| boolean | isPrime | int num |
例えば、実引数が2なら素数なのでtrueを返し、10なら素数ではないのでfalseを返します。
isPrimeメソッドの素数判定の方法はBreakSample01のそれとよく似ています。 しかし、isPrimeメソッドでは、boolean型の変数primeというものは利用せず、numが素数でないことが確定した時点で、return文によってfalseを返します。 それは具体的には次のときです。
- numが1と自分自身以外の数で割り切れたとき
- numが1であることが分かったとき
これら2つのうちいずれも起こらなかった場合は、numは素数なので、メソッドの最後のreturn文によってtrueが返されることになります。
この例ように、一つのメソッドの中にreturn文が複数個有ってもかまいません。 もちろん、一旦return文が実行されると、呼び出し元に処理が戻るため、他のreturn文が実行されることはありません。
mainメソッドの中でのisPrimeメソッドの呼び出し方にも注目してください。 isPrimeメソッドを呼び出す式が、if文の条件としてそのまま使われています。 isPrime(n)という式自体が、trueかfalseの値を持っているので、このような使い方ができるのです。 わざわざ、
if(isPrime(n) == true)
のような書き方をする必要はありません。
尚、isPrimeというメソッド名は、「N is a prime number.(Nは素数である。)」という英文になぞらえたものです。
boolean型の値を返すメソッドの呼び出しは、そのままif文の条件として利用できる。