Developer

【はじめてのJava】戻り値【オブジェクトとクラス編】
2021.10.29
Lv1

【はじめてのJava】戻り値【オブジェクトとクラス編】

はじめてのJava

このシリーズでは、初めてJavaやプログラミングを勉強する方向けに、Javaによるプログラミングの基礎を説明していきます。
目標レベルは、Javaの資格試験の一つである「Oracle Certified Java Programmer, Silver」(通称Java Silver)に合格できる程度の知識の習得です。
はじめてJavaやプログラムに触れる方にもできるだけわかりやすい解説を心がけていきます。


オブジェクトとクラス編

オブジェクトとクラス編では、Javaを扱う上で非常によく出てくる「オブジェクト」や「クラス」について扱っていきます。

前回は「メソッドの引数」について扱いました。

今回は「メソッドの戻り値」について扱っていきます。


目次


戻り値

 戻り値 とは「メソッドの処理の結果戻ってくる値」のことです。

戻り値について詳しく見ていきましょう。


戻り値とは

戻り値とは、上記で書いた通り、 メソッドの処理の結果戻ってくる値 のことです。

引数の時と同様に、下図のような、コンビニやスーパーのレジを考えます。

この時、レジの機械は「商品の値段」「支払金額」を基に「お釣り」を計算しています。ですので、レジがメソッドの役割を果たしていると考えましょう。

このとき、レジメソッドは処理の結果、「お釣り」を戻します。この「お釣り」がレジメソッドにとっての戻り値になります。


戻り値の書き方

戻り値はメソッドの定義時に書く必要があります。

そのメソッドを使った結果、どんなデータ型のデータが返ってくるのかを書きます。

具体的にみていきましょう。


戻り値のデータ型

レジメソッドのような、「処理の結果値を戻す」メソッドの定義時には、そのメソッドを使った結果、どんなデータ型が戻ってくるのかを書きます。

これは、メソッドを使うときに、「何が戻ってくるのか」わかっていないとソースコード内で使用できないためです。

例えば、レジメソッドを使った際に、お釣りの現金の代わりに小切手が戻ってきたら、戸惑います。それを避けるために、あらかじめ何でお釣りを返すのかを記載しておきます。

改めてメソッドの書き方を確認すると、以下の通りとなっています。

/* 戻り値(のデータ型) */ /* メソッド名 */(/*引数*/){
  /* 処理内容 */
  /* 戻り値(の値) */
}

レジメソッドの名前をcashRegisterとし、前回の引数の部分を反映すると以下のようになります。

/* 戻り値(のデータ型) */ cashRegister(int price, int payment){
  /* 処理内容 */
  /* 戻り値(の値) */
}

これに、「戻り値(のデータ型)」を書き足していきます。

なお、どんな戻り値も不要な場合は戻り値のデータ型にはvoidを指定します。


戻り値の定義の手順

戻り値の定義の手順は以下の通りです。

  1. 戻り値のデータ型を決める
  2. メソッド内でreturnするようにメソッドを作る

手順に沿って決めていきましょう。

まずは戻り値のデータ型を決めます。今回は「お釣り」を戻すと考えます。

お釣りは整数で戻せばOKだと考え、「int型」にしましょう。

これを反映させると次のようになります。

int cashRegister(int price, int payment){
  /* 処理内容 */
  /* 戻り値(の値) */
}

これで戻り値のデータ型は決まりました。しかし、このままでは最終的に値を戻す部分を記載していないため、メソッドは戻り値を戻しません。

そこで続けて戻り値を戻すようにします。戻り値を戻す部分は return キーワードを使って記載します。

これは次のように書きます。

int cashRegister(int price, int payment){
  /* 処理内容 */
  return /* 戻り値(の値) */;
}

今回は「支払金額(payment)」と「商品の値段(price)」の差額をお釣りとして戻します。

そこで、お釣りを「change」という変数として宣言して、changeの値を戻すことにします。

int cashRegister(int price, int payment){
  int change = payment - price; //お釣りの金額の計算
  return change;
}

これで戻り値を定義することができました。


戻り値の注意点

このように戻り値を利用すれば、メソッドが処理した結果を戻すことができます。ただし、戻り値を戻す際には以下の点に注意が必要です。

  1. 戻り値のデータ型に記述可能なデータ型は1種類のみ
  2. 戻り値は1つしか戻せない
  3. returnを実行するとそこでメソッドの処理は終了となる

順にみていきましょう


複数の異なるデータ型を戻り値のデータ型に記述することはできない

javaではメソッドの定義時に 戻り値のデータ型に記述可能なデータ型は1種類のみ です。

例えば、お釣りが「現金」で来るのか「小切手」で来るのかわからないレジがあったら、そのレジはまともに使うことができません。

同じように、メソッドの定義時には、戻り値のデータ型が1種類に決まる必要があります。

戻り値のデータ型が異なる場合は「メソッドとして別にする」「Object型(もしくはその他キャスト可能な共通の親クラス)を戻り値のデータ型として記述する」といった方法を取る必要があります。

なお、「Object型を戻り値のデータ型として記述する」場合は、いろいろと細かい注意が必要です。(詳しくは本記事では割愛します。)


戻り値は1つしか戻せない

javaでは 戻り値の値は1つしか戻せません 。なので、例えば「お釣り」と「レシート」を同時に戻すメソッドは作成できません。

もしお釣りのほかにレシートが必要な場合は、レシートを戻すメソッドを別に作成する必要があります。

一見すると不便に思う人もいるかもしれませんが、1つのメソッドには1つの処理をまとめるのが上手いメソッドの書き方です。

もし「お釣り」と「レシート」を同時に戻すメソッドがあった場合、一見便利に見えますが、もし「レシート」の代わりに「領収証」が欲しい場合は「お釣り」と「領収証」を戻すメソッドを別に作る必要がります。その際に、一度作っているはずの「お釣り」を計算して戻す部分も、0から記述する必要があります。

一方で、「お釣り」と「レシート」を戻すメソッドを別にしていた場合は、「お釣り」を戻すメソッドはそのまま流用可能なので、「領収証」を発行するメソッドを作るだけでOKです。


returnを実行するとそこでメソッドは終了となる

javaでは通常は return文が実行されるとメソッドの処理が終了します 

例えば、お会計はお釣りをもらうと終了となります。そのため、お釣りをもらい終わった後で新たに商品を購入したい場合は、1からお会計をやり直すことになります。お釣りをもらった時点で処理が終わるため、同じお会計に新しい商品のお会計処理を含めることはできません。

これと同じように、return文が実行されると戻り値を戻して処理が終了となるため、通常はreturn文の後にそのメソッド内で追加処理が実行されることはありません。

※例外処理のfinallyという部分が関連した場合は追加処理が実行される可能性があります。この記事は例外処理の記事ではないため、詳細は割愛します。


まとめ

メソッド作成時には、処理の結果戻す値のデータ型を記述する。どんな戻り値も不要な場合は戻り値のデータ型にはvoidを指定する。
戻り値は1つしか戻せない。
戻り値はreturn文で戻す。return文が実行されるとそのメソッドの処理は終了となる。

次回

次回は引数と戻り値があるメソッドの使い方をまとめます。


はじめてのJavaシリーズの目次はこちら
オブジェクトとクラス編はこちら


java 11 の練習問題一覧はこちら
はじめてのJavaシリーズの練習問題一覧はこちら