メソッドの戻り値

呼び出し元からメソッドに値を渡すのとは逆に、メソッドから呼び出し元に値を返す方法も用意されています。 ここでは、その方法について学習していきましょう。

値を返すメソッド

メソッドは、その処理の結果得られた値を呼び出し元に返すことができます。 この値のことを戻り値(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;
    }
表 9-4 : sumUpメソッド
戻り値の型 メソッド名 引数リスト
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 式;
図 9-4 : sumUpメソッドのイメージ

メソッドは、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です。
図 9-5 : sumUpメソッドの呼び出しと戻り値

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メソッドは、与えられた整数が素数であるかどうかを判定して、結果を返すメソッドです。

表 9-5 : 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文の条件として利用できる。