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 戻り値 }
次回は戻り値についてもう少し突っ込んでみます。
今だけ→転職できなければ全額返金の「エンジニア転職保証コース」
絶対エンジニアになる!→テックエキスパート
フリーランスエンジニアの収入例を見てみる→レバテックフリーランス
コメント
さっぱりわかりませんでした。
by tesu 2014/08/11 15:03
残念です。。
ゆっくり一つずつ理解しながら読んでみて下さい。
by nobuo@管理人 2014/08/11 15:35
戻り値のことがわからなかったのですが、「【Java】 メソッドの戻り値について」を読んでよくわかりました。ありがとうございました。「一番かんたんなJava入門」はとても丁寧に説明されているのでとても参考になりますので、Javaの基礎を学ばせてもらいます。
by K 2014/08/13 21:35
ありがとうございます。
お役に立てたようで嬉しいです。頑張ってください!
by nobuo@管理人 2014/08/14 22:08
Javaを勉強し始めてからわからなくなるたびにこのサイトで勉強させて頂いています。
とてもわかりやすい説明なのでとても参考になります。
by Java初心者 2014/10/11 22:00
>わからなくなるたびにこのサイトで勉強させて頂いています。
なんとまあ嬉しい表現を。
お役に立てているようで嬉しいです。ありがとうございます。
頑張って勉強してください!
by Nobuo@管理人 2014/10/11 22:48
毎回とても分かりやすい説明でありがたいです。
今回の例文では、isMultipleOf3メソッドの中で変数nが用いられているのに対し、mainメソッドでは変数aが用いられている点に疑問を感じました。
isMultipleOf3メソッド中のnは特定の変数を示すものでなく、「前に出た数字aなりbなりの値をあてはめるもの」といった認識で良いでしょうか?
日本語が拙くて申し訳ないです。
by 初めてのJava 2015/01/28 00:21
>今回の例文では、isMultipleOf3メソッドの中で変数nが用いられているのに対し、mainメソッドでは変数aが用いられている点に疑問を感じました。
非常にいい疑問だと思います。
仮引数と実引数っていうのが理解できれば疑問は消えると思います。
仮引数 - メソッドを定義する際に使う仮の引数(名前は原則なんでもいい)
実引数 - メソッドを呼ぶ際に実際に渡す引数
もし分かりにくかったらもう一度、メソッドの引数についてを読んでみてはどうでしょうか?
by Nobuo@管理人 2015/01/28 01:11
大体の流れは理解できたのですが、if文の中にあるisMultipleOf3(a)はどういった処理を表しているのでしょうか?
通常if文というと if(n>10) みたいな感じが馴染み深いのですが、boolean型の時だけ記述できる方法なのでしょうか?
もし良かったら教えてくださいo(>_<)o
by S 2015/03/10 23:22
戻り値がbooleanならif文の括弧の中に入れることが出来ます。
評価するっていう感覚を理解して下さい。演算子って何
by Nobuo@管理人 2015/03/11 01:14