第12講・STEP 02

メソッドの戻り値って何?

戻り値についての説明をします。初心者が頭パニックになりがちなところなので丁寧にやります。言葉だけでは分かりにくいので、具体的に戻り値を返すメソッドを作って使ってみましょう。

戻り値を返すメソッドを作る

 引数に渡された値が、3で割り切れるかどうかを判断するメソッドを作ります。大丈夫、簡単です。

 class名は「ReturnTest」にします。

 メソッド名は「isMultipleOf3」にします。「multiple of 3」で3の倍数という意味です。その前に「is」をつけて「isMultipleOf3」です。「is〜」は、trueかfalseを返すメソッドでよく使われる名前の付け方です。

ReturnTest.java

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

   }
   public static void isMultipleOf3(int n){

   }
}

 mainメソッドはとりあえず空っぽで、その下に「isMultipleOf3」メソッドの定義です。引数にint型の値を受け取れるように定義します。

 この引数に渡された値が3で割り切れるかどうかを判断します。判断するとはどういうことかと言うと、もし引数に渡された値が3で割り切れるならこのメソッドはtrueを返します。もし割り切れなかったらfalseを返します。

 「返す」の意味がよく分からないと思いますが、やれば分かるのでやってみましょう。

 では具体的に、引数に渡された値を仮にnとしてどう処理するかを書いていきます。

ReturnTest.java

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

   }
   public static void isMultipleOf3(int n){
      boolean result;
   }
}

 まずは、isMultipleOf3メソッドの中でboolean型の変数resultを宣言しました。boolean型は、trueかfalseのどちらかの値を扱う型です。

 このboolean変数resultに、nの値が3で割り切れるならtrueを入れて、そうでなければfalseを入れます。

ReturnTest.java

public class ReturnTest{
   public static void main(String[] args){
      
   }
   public static void isMultipleOf3(int n){
      boolean result;
      result = ( n % 3  == 0 );
   }
}

ReturnTest.java

result = ( n % 3  == 0 );

 ↑これが何をやっているのか一応、説明します。

 「%」は算術演算子の一種で、左オペランドの値を右オペランドで割った余りを算出する演算子です。(参考:演算子って何?)

ReturnTest.java

n % 3

 これはnを3で割った余りの値に置き換わります。もしnが8なら2になるし、nが15なら0になります。もしnが3で割り切れるなら「n % 3」は0に置き換わるということですね。

ReturnTest.java

n % 3  == 0

 「==」は比較演算子の一種で、左右のオペランドの値が同じであればtrueに、そうでなければfalseに評価されます。つまり、この式はnが3で割り切れればtrueに置き換わるし、割り切れなければfalseに置き換わるということです。

 それをboolean型変数resultに代入しています。

ReturnTest.java

result = ( n % 3  == 0 );

 これで、引数に渡された値nが3で割り切れればresultにtrueが代入されて、3で割り切れなければresultにfalseが代入されることになります。

 ではこの値を返します。

ReturnTest.java

public class ReturnTest{
   public static void main(String[] args){
      
   }
   public static void isMultipleOf3(int n){
      boolean result;
      result = ( n % 3  == 0 );
      return result;
   }
}

 初登場、「return」です。これが返すというやつです。何を返すかというと、

ReturnTest.java

return result;

 変数resultに入っている値を、呼び出し元へ返しています。変数resultには、引数に渡されたnが3で割り切れればtrueが、割り切れなければfalseが入っているんでしたね。これで、このメソッドは引数に渡された値が3で割り切れればtrueを返し、割り切れなければfalseを返すメソッドになりました。

 ところで、返すって一体どこに返すのか?

 それは、メソッドを呼び出した側へ返します。呼び出しを書いた式の値が、返された値になる、と考えると分かりやすいです。もうちょっと頑張って話を進めましょう。

戻り値を返すメソッドを使う

 では、このisMultipleOf3メソッドを実際、使ってメソッド自身の場所に戻り値が返ってくるとはどういうことなのか見て行きましょう。

ReturnTest.java

public class ReturnTest{
   public static void main(String[] args){
      int a = 23165247;
   }
   public static void isMultipleOf3(int n){
      boolean result;
      result = ( n % 3  == 0 );
      return result;
   }
}

 3で割り切れるかどうかチェックしたい数字23165247を、変数aに入れます。

 どんな数字でもいいのですが、あえてパッと見では3で割り切れるか分かりにくい数字にしました。そして、if文の条件式の中で、aを引数に渡してisMultipleOf3メソッドを呼びます。

ReturnTest.java

public class ReturnTest{
   public static void main(String[] args){
      int a = 23165247;
      if( isMultipleOf3(a) ){

      }else{
         
      }
   }
   public static void isMultipleOf3(int n){
      boolean result;
      result = ( n % 3  == 0 );
      return result;
   }
}

 if文というのはまず、条件式が評価されて、それがtrueならばその直後のブロック内が実行されるのでした。(参考:if文って何?)

 なのでこの形では、まず条件式が評価されます。条件式は、

ReturnTest.java

isMultipleOf3(a)

です。ここでこのメソッドが呼ばれて評価されます。つまり、aが3で割り切れるならこのメソッドがtrueに置き換わり、割り切れなければこのメソッドがfalseに置き換わります。

 この「置き換わる」というのが「メソッド自身の場所に戻り値を返す」ということです。isMultipleOf3(a)はtrueかfalseに置き換わるわけです。

if(5 < 8){ }

↑この「5<8」がtrueに置き換わるのと同じ理屈です。

 というわけで、このif文はaが3で割り切れれば上のブロックを実行し、割り切れなければ下(else)のブロックが実行される状態になりました。ではブロックの中身を入れましょう。

ReturnTest.java

public class ReturnTest{
   public static void main(String[] args){
      int a = 23165247;
      if( isMultipleOf3(a) ){
         System.out.println(a + "は3で割り切れます");
      }else{
         System.out.println(a + "は3で割り切れません");
      }
   }
   public static void isMultipleOf3(int n){
      boolean result;
      result = ( n % 3  == 0 );
      return result;
   }
}

 if文のブロックの中は大丈夫ですね。ではこのプログラムを実行し・・、ちょっと待ったー!もう一つ大事なことがあります。

戻り値の型

 戻り値を返すメソッドを定義する時には、大事な大事な約束事があります。isMultipleOf3メソッドの定義部分をもう一度見てみましょう。

ReturnTest.java

public static void isMultipleOf3(int n){
      boolean result;
      result = ( n % 3  == 0 );
      return result;
   }

 メソッド名の直前に「void」という謎の単語が書いてありますね。今まで意味が分からないまま書いていたと思います。

 戻り値を返すメソッドを定義する場合は、ここを書き替えないといけません。何に書き換えるかというと、戻り値の型です。

 このメソッドの場合、「return result;」としているので戻り値は変数resultに入っている値ですね。そしてresultの型はbooleanです。つまり、boolean型の値を戻り値として返すように定義する場合は、「void」の部分を「boolean」に書き換えるんです。

ReturnTest.java

public static boolean isMultipleOf3(int n){
      boolean result;
      result = ( n % 3  == 0 );
      return result;
   }

 これで、戻り値にboolean型の値を返すメソッドの定義はOKです。

ReturnTest.java

public class ReturnTest{
   public static void main(String[] args){
      int a = 23165247;
      if( isMultipleOf3(a) ){
         System.out.println(a + "は3で割り切れます");
      }else{
         System.out.println(a + "は3で割り切れません");
      }
   }
   public static boolean isMultipleOf3(int n){
      boolean result;
      result = ( n % 3  == 0 );
      return result;
   }
}

23165247が果たして3で割り切れるかどうか実行してみましょう。

実行結果
23165247は3で割り切れます

 23165247は3で割り切れるみたいです。
 一応、3で割り切れないのも入れてみましょう。aに5を入れて実行すると、

実行結果
5は3で割り切れません

 ちゃんと機能してますね。ぜひいろんな値を入れて実行してみて下さい。

「void」の意味

 ところで、今まで意味分からずに使っていた「void」って一体何?ということなんですが、「void」は「このメソッドは戻り値を返しません」という意味のキーワードなんです。

 メソッドを作るときに戻り値を返さないメソッドにするなら、メソッド名の直前に「void」を入れなければなりません。戻り値を返すメソッドにするなら、その戻り値の型をメソッド名の直前に入れて、命令内容定義ブロックの中で「return 戻り値;」と、しなければなりません。

 returnする値は、宣言した戻り値の型として受け取れるものでなければなりません。例えば、booleanを返すメソッドで文字列を返すことはできません。ただし、intの値をdoubleとして返すように、自動的な型変換が認められる場合もあります。

次回は戻り値についてもう少し突っ込んでみます。

目次へ

質問・コメント

読み込み中

この記事についての質問や、学習して気づいたことをお寄せください。

コメントを書く

投稿フォームを準備しています。

コメントと一緒に公開される名前です。
3,000文字以内。パスワードなどの個人情報は書き込まないでください。

コメントは送信後すぐに公開されます。

この記事のコメント

旧サイトに寄せられたコメントも当時の投稿内容のまま掲載しています。現在の記事では変更している内容や、旧環境についてのやり取りも含まれます。

コメントを読み込んでいます。