[Java] メソッドの処理結果を返す仕組み 戻り値とは

2017年3月25日(更新: 2018年1月23日)

前回はメソッドの書き方や引数の渡し方、クラスについての簡単な説明などを行いました。

今回は、メソッドの重要な機能である戻り値について紹介します。

メソッドの処理結果を戻り値として返す

例えば、2つの整数を引数として受け取り、それらを掛け合わせた数値を計算してくれるメソッドがあるとします。

public class Test {
  
  public static void main(String args[]) {

    Test t = new Test();

    // メソッド multiply に2つの数値を渡して呼び出す
    t.multiply(4, 5);
  }

  void multiply(int num1, int num2) {
    int answer = num1 * num2;
    System.out.println(answer);
  }
}

要するに、掛け算を行うメソッドです。

上記のように、数値 4 と 5 を渡した場合、実行結果は以下のようになります。

かけ算を行うメソッドの実行例

ここで、この計算結果の数値を使って、もう一度かけ算を行いたいとします。

このような場合、このメソッド内で計算された結果を変数に格納できると便利です。

そこで利用されるのが、メソッドの戻り値です。

戻り値とは、メソッド内の数値や文字列などのデータを、呼び出し元のメソッドで利用できるように返す仕組みです。

まず、実際に戻り値を利用したプログラムのソースと動作を御覧ください。

public class Test {
  
  public static void main(String args[]) {

    Test t = new Test();

    // メソッドの実行結果を変数に代入
    int answer1 = t.multiply(4, 5);

    // 前の計算結果を利用した計算を行う(ここでは戻り値は利用しない)
    t.multiply(answer1, 3);
  }

  // 計算結果を戻り値で返すメソッド
  int multiply(int num1, int num2) {
    int answer = num1 * num2;
    System.out.println(answer);

    return answer;
  }
}

実行結果は以下のようになります。

戻り値を利用したメソッドの実行結果

1度目の multiply の実行で得られた結果 20 を戻り値として返し、その値を再度 multiply の引数として利用しています。

戻り値を返すメソッドの定義方法

戻り値を返すためのメソッドの書き方があります。

戻り値の型を指定

前回、メソッドを定義する際は、次のように書くことを紹介しました。

void メソッド名(引数) {
  // メソッドの処理
}

メソッド名の前にある void というのは、英語で「空」や「無効」という意味ですが、プログラム的には「戻り値が無い」ということを意味します。

戻り値を返すメソッドを定義する場合、この部分を書き換える必要があります。

例えば、例のように整数値を戻り値として返すメソッドにしたい場合、void の部分を int にします。

int メソッド名(引数) {
  // メソッドの処理
}

void 以外の型を指定したメソッドは、必ず値を返さなければなりません。

実際の戻り値を指定

実際に値を返すには、return文を使います。

以前にも登場した retrun は処理を中断させる命令でしたが、return の後にデータを指定することで、処理の中断と同時に値を返すことができます。

ただし、void型のメソッドは値を返す事ができないので return の後にデータを指定する事はできません。

int メソッド名(引数) {
  return 値;
}

これによって、「値」が戻り値となります。

「値」の型は、先ほど書き換えたメソッドの冒頭部分の型(この例では int の部分)と一致していなければいけません。

例えば、小数を戻り値として返すメソッドであれば、以下のように書く必要があります。

float test() {
  return 0.5;
}

戻り値を受け取る

メソッドから返される戻り値を利用する場合、それを変数に代入するのが一般的です。

int answer1 = t.multiply(4, 5);

これで、変数 answer1 に、メソッド multiply の戻り値が格納されます。

戻り値は受け取らないで破棄することも可能です

戻り値を受け取らずにメソッド内の処理だけ実行する場合は、普通のメソッド(voidのメソッド)を呼び出すときと同じように書けます。

t.multiply(answer1, 3);

実は、これまで作ったプログラムの中でも、戻り値を受け取っている場面がありました。

クラス Scanner の機能である、数値をキーボードから受け取るメソッドは、戻り値を返すメソッドでした。

Scanner scan = new Scanner(System.in);

int month = scan.nextInt();

戻り値を使ったプログラムの例

様々な計算結果を戻り値として返すメソッドの例です。

public class Test {
  
  public static void main(String args[]) {

    Test t = new Test();

    int answer1 = t.add(4, 5);
    
    System.out.println("足し算の結果: " + answer1);
    
    int answer2 = t.sub(answer1, 2);
    
    System.out.println("引き算の結果: " + answer2);

    int answer3 = t.multiply(answer2, 10);
    
    System.out.println("掛け算の結果: " + answer3);
    
    int answer4 = t.divide(answer3, 7);
    
    System.out.println("割り算の結果: " + answer4);
  }
  
  // 足し算
  int add(int num1, int num2) {
    return num1 + num2;
  }
  
  // 足し算
  int sub(int num1, int num2) {
    return num1 - num2;
  }

  // 掛け算
  int multiply(int num1, int num2) {
    return num1 * num2;
  }
  
  // 割り算
  int divide(int num1, int num2) {
    
    if (num2 == 0) {
      // 0 では割れないので、メッセージを表示して 0 を返す
      System.out.println("0では割れません");
      return 0;
    }

    return num1 / num2;
  }
}

実行結果です。

様々な計算の結果を戻り値として返すメソッドの例

割り算は、0で割るとエラーとなるため、if文で処理を分けています。

ローカル変数について

メソッドの中で定義した変数は、メソッドの外(他のメソッド内)では呼び出すことができません

逆に言えば、以下のようにメソッドが別であれば、他のメソッドに存在する変数と同じ名前の変数を定義することができます。

...

void test1() {
  int a = 0
  System.out.println(a);
}

void test2() {
  int a = 0
  System.out.println(a);
}

...

引数についても同じことが言えます。

...

// 足し算
int add(int num1, int num2) {
  return num1 + num2;
}
  
// 足し算
int sub(int num1, int num2) {
  return num1 - num2;
}

...

このような、メソッド内で定義された変数は、ローカル変数と呼ばれます。

コメントを残す

メールアドレスが公開されることはありません。