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 戻り値 }
次回は戻り値についてもう少し突っ込んでみます。
今だけ→転職できなければ全額返金の「エンジニア転職保証コース」
絶対エンジニアになる!→テックエキスパート
フリーランスエンジニアの収入例を見てみる→レバテックフリーランス
コメント
>戻り値がbooleanならif文の括弧の中に入れることが出来ます。
なるほど、そうだったんですね!
もう一度、演算子って何 を見直したいと思います。
お返事ありがとうございます。
by S 2015/03/11 09:38
ここでも紹介されている「スッキリわかるjava入門」を読みながら0からやってきました。
未経験でこういうものをするのも初めてなので全然進んでません。
本でもわかりにくい説明の時はネットを見たりしてかろうじてわかったつもりで進んでいます。
戻り値(return)が全然理解できなくてもう完全に止まっています。
本ではその直後もreturnを使用していて理解しないと進めない感じでしたので今調べています。
「値を返す」等がよくわかってないのですが、
基本的に、呼び出しで使用したものは直後勝手に元の場所に戻っていると認識していました(何度も使えるため)
が「returnを使い呼び出し元へ返す」という作業が出てきました。
何故返す作業?返して(受け取って)どうするの?voidに至っては返さない?という感じです。
returnはどのような時に使うのか(使用用途)がどのサイトでも見つけきれませんでした。もし書いていたらすみません…(自分の求めていた説明ではない等で見つかりませんでした)
「このようなときにreturnを使う」「returnを使うことにより●●(が出来るように)になった」
ような例え等が欲しかったのですが、言葉足らずでわかりにくくてすみません。
by ああ 2015/03/12 18:47
>ああさん
returnの前に、メソッドの定義と呼び出しをしっかり理解したら分かると思います。。
by Nobuo@管理人 2015/03/14 01:55
指摘ありがとうございます。
まずそっちをよく理解してみたいと思います‼
by ああ 2015/03/14 12:51
if(isMultipleOf3(a){ A }
としたときに、戻り値がtrueであればAが実行されるということですが、
たんにisMultipleOf3(a) としただけでは、「aが3で割り切れるのか、そうでないかがわかる」だけではないのか?というのが疑問です。「戻り値がtrueであればAを実行する」という意味合いまで持つのでしょうか。よろしくお願いいたします。
by 匿名 2015/06/03 17:47
if(isMultipleOf3(a)){ A }
としたときに、Aを実行するのはtrueのときであるのかfalseのときであるのか、ということまで定められているのか?という意味です。
by 匿名 2015/06/03 17:49
そもそもの質問ですみません。
「int n」のnにはaの23165247を代入?しているのかと思いますが
この場合int n=23165247という定義がないのに
なぜ成り立っているのでしょうか?
isMultipleOf3(int n)がそれにあたるのでしょうか??
by T 2015/12/24 18:00
>Tさん
メソッドの引数についてhttp://nobuo-create.net/java-beginner-12/をよく読んで理解して下さい。
by Nobuo@管理人 2015/12/24 20:34
boolean型についてですが、これはint型でも良い気がしています
容量の節約でしょうか?
by はる 2016/07/16 23:23
どこのjava入門サイトより一番わかりやすい
by もやよん 2017/02/15 14:46