メソッドの戻り値
呼び出し元からメソッドに値を渡すのとは逆に、メソッドから呼び出し元に値を返す方法も用意されています。 ここでは、その方法について学習していきましょう。
値を返すメソッド
メソッドは、その処理の結果得られた値を呼び出し元に返すことができます。 この値のことを戻り値(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文の条件として利用できる。