2019/02/06
戻り値についての説明をします。初心者が頭パニックになりがちなところなので丁寧にやります。
とは言え、言葉でいくら丁寧に説明しても理解不能だと思うので、具体的に戻り値を返すメソッドを作って使ってみましょう。
sponsored link
戻り値を返すメソッドを作る
引数に渡された値が、3で割り切れるかどうかを判断するメソッドを作ります。大丈夫、簡単です。
class名は「ReturnTest」にします。
メソッド名は「isMultipleOf3」にします。「multiple of 3」で3の倍数という意味です。その前に「is」をつけて「isMultipleOf3」です。ちょっと変な名前ですが、いいのが思いつきませんでした。。まあ英語の勉強だと思って付き合って下さい。
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 );
}
}
result = ( n % 3 == 0 )
↑これが何をやっているのか一応、説明します。
「%」は算術演算子の一種で、左オペランドの値を右オペランドで割った余りを算出する演算子です。(参考:演算子って何?)
n % 3
これはnを3で割った余りの値に置き換わります。もしnが8なら2になるし、nが15なら0になります。もしnが3で割り切れるなら「n % 3」は0に置き換わるということですね。
n % 3 == 0
「==」は比較演算子の一種で、左右のオペランドの値が同じであればtrueに、そうでなければfalseに評価されます。つまり、この式はnが3で割り切れればtrueに置き換わるし、割り切れなければfalseに置き換わるということです。
それをboolean型変数resultに代入しています。
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」です。これが返すというやつです。何を返すかというと、
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文って何?)
なのでこの形では、まず条件式が評価されます。条件式は、
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メソッドの定義部分をもう一度見てみましょう。
public static void isMultipleOf3(int n){ boolean result; result = ( n % 3 == 0 ); return result; }
メソッド名の直前に「void」という謎の単語が書いてありますね。今まで意味が分からないまま書いていたと思います。
戻り値を返すメソッドを定義する場合は、ここを書き替えないといけません。何に書き換えるかというと、戻り値の型です。
このメソッドの場合、「return result;」としているので戻り値は変数resultですね。そしてresultの型はbooleanです。つまり、boolean型の値を戻り値として返すように定義する場合は、「void」の部分を「boolean」に書き換えるんです。
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で割り切れるみたいです。
一応、3で割り切れないのも入れてみましょう。aに5を入れて実行すると、
ちゃんと機能してますね。ぜひいろんな値を入れて実行してみて下さい。
「void」の意味
ところで、今まで意味分からずに使っていた「void」って一体何?ということなんですが、「void」は「このメソッドは戻り値を返しません」という意味のキーワードなんです。
メソッドを作るときに戻り値を返さないメソッドにするなら、メソッド名の直前に「void」を入れなければなりません。戻り値を返すメソッドにするなら、その戻り値の型をメソッド名の直前に入れて、命令内容定義ブロックの中で「return 戻り値;」と、しなければなりません。
もちろん、returnする値の型とメソッド名の前に書く変数型は同じじゃないと駄目です。コンパイルエラーになります。
check point!
- ・戻り値を返さないメソッドの定義
- void メソッド名( ){ }
- ・戻り値を返すメソッドの定義
- 戻り値の型 メソッド名( ){ return 戻り値 }
次回は戻り値についてもう少し突っ込んでみます。
今だけ→転職できなければ全額返金の「エンジニア転職保証コース」
絶対エンジニアになる!→テックエキスパート
フリーランスエンジニアの収入例を見てみる→レバテックフリーランス
コメント
(int n) これに int a の値を代入してからメソッドを実行するから、int nを宣言するんですか??
すみません、全然わからなくて、、、
by ルカス 2018/06/26 01:28
ようやく、戻り値について理解することができました。
丁寧で、わかりやすい解説本当にありがとうございました!
あぁ~、本当にすばらしいサイトを見つけました!
こんなにわかりやすいサイトは初めてです。
by ルイ 2018/09/19 13:22
どうしてもここ周辺で挫折してしまいます・・・。
by >< 2019/04/21 10:55
とか言いながら自分なりに解釈したのですが、
mainに書かれた数値aをis~に渡す→is~で結果を解く→その結果をメインタグのifに戻す・・・って考え方で間違ってはいないでしょうか?今後学習するにあたって問題があるなら訂正していただきたいです・・・。
by >< 2019/04/21 11:29
「ifに戻す」ってのがちょっと違うかなと思います。戻る場所はそのメソッド自身です。メソッド自身が戻り値(結果)に置き換わるイメージです。
腑に落ちないところについてよく考えるのも大事ですが、完全に理解できるまで前に進まないというのはよくないと私は思います。ほとんどのことは後から「あ、そういうことか!」と分かるからです。
進んだり戻ったりしながら、少しずつ理解していって下さい!
by Nobuo@管理人 2019/04/21 11:49
>管理人さん
なるほど・・・うーん難しいですね・・・。
今はある程度のことはそういうものなんだと頭ごなしに覚えつつ、とりあえずは次の項目を読み進めてみようと思います。また引っかかった時に考えます、お返事ありがとうございました!
by >< 2019/04/21 18:25
もしこの記事の、メソッド自身に返す、という所がわからない方がいたらこう考えると良いかもしれません。かくいう私もこの記事でそこにずっとひっかかっていましたが自分なりの解釈をようやく見つけ、その解釈に記事と矛盾点がないように思えたのですっきりわかった、と判断しました。
もしかしたら結局記事と同じ事言っててオリジナル解釈とは言えないかもしれません。
逆にもし間違った解釈であれば、管理人さん、ご指摘あると助かります。
by 匿名 2019/04/24 14:31
申し訳ありません。解釈の文章化が難しく1時間どう書くか悩みまして、少しだけ。
極論になりますがresultをメインメソッドに返すためのものと言って良いと思います。
返すのはisMultipleOf3メソッド自身と記事にありますが。
他のメソッドを呼び出して処理する文字通りメインとなる処理のメインメソッド、これにisMultipleOf3が関わっているのはif()の()内のみ。条件式でなければならないのでisMultipleOf3の正体はtrueかfalseでなければならない。
trueかfalseが正体でなければならないisMultipleOf3のメソッド。
最後のreturn resultとは、これも極論になりますがisMultipleOf3==resultにするという事。
isMultipleOf3の正体の問題にresultという解答を返すという事。
resultのためのisMultipleOf3、戻り値を返すメソッドは戻り値のためのメソッド。最終的に戻り値と化すメソッド。
ですので理解の流れを中途半端に省略すればresultをメインメソッドに返すという言い方でも、「一応間違ってはいない」と思います。resultの中身を答えとしてisMultipleOf3の正体の謎に返答する(メソッド自身に返す)、result==isMultipleOf3となる、そのisMultipleOf3をメインメソッドへという流れなのでこれは流れの両端だけ見ればresultを返すという見方も出来る。解説としては簡略化しすぎて変だと思いますが。
by 匿名 2019/04/24 15:33
半分戻り値の話ではなかったです。
trueかfalseでなければならないためresultはそうなる処理(3で割り切れ~)の結果が入ってreturn。そしてその前にresultがtrueかfalseかとなる変数とするためにboolean型での定義(何にせよ定義はしなければならないのですが)
そして戻り値がbooleanのものという事でvoidをbooleanのメソッドに。
by 匿名 2019/04/24 15:40
メソッドと呼ぶから難しくなる。
メソッド=「職人」だと思えばいい。
このページの例なら、isMultipleOf3()という名前のメソッド職人は、「どんな数値でも3で割り切れるか判断できる職人」だと考える。
判断したい数値を入れ物(上の例では変数a)に入れて渡す(isMultipleOf3(a))と、この職人は仕事をして結果を戻す。
あなたは戻された「結果」を利用する(上の例ではifを使う「判断」に利用している)。
by 匿名 2019/05/31 10:59