Java超|メソッドの戻り値と使い方

メソッドは処理して終わりではありません。return で結果を返せるようになると、悟空オブジェクトから名前や戦闘力を受け取り、次の処理へつなげられます。

これまで、メソッドには引数を渡せることを学んできました。

たとえば、悟空の名前、戦闘力、流派の印、流派名を設定するときは、呼び出し側からメソッドへ値を渡していました。

goku.setSaiyanData("悟空", 9000, "亀", "亀仙流");

このように、呼び出し元からメソッドへ情報を送ることで、オブジェクトの状態を設定できます。

ただ、メソッドのやり取りは、呼び出し元からメソッドへ送るだけではありません。
今度は逆に、メソッドの中で得られた結果を、呼び出し元へ返すこともできます。

この返ってくる値を戻り値といいます。

ドラゴンボールの世界観でたとえると、悟空に対して「今の名前を教えて」「現在の戦闘力を報告して」「流派の印を確認して」とたずねる場面です。
悟空オブジェクトは自分の状態を確認し、その結果を呼び出し元へ返します。

つまり、引数が「こちらから悟空へ渡す情報」なら、戻り値は「悟空からこちらへ返ってくる報告」です。

この記事では、メソッドの戻り値、return、void、戻り値を変数に入れて使う流れを、ドラゴンボールの世界観に置き換えて整理していきます。

戻り値はメソッドから呼び出し元へ返される情報

戻り値とは、メソッドの処理結果として呼び出し元へ返される値です。

引数は、次のような向きでした。

しくみ向き役割
引数呼び出し元 → メソッド値を渡す

一方、戻り値は逆向きです。

しくみ向き役割
戻り値メソッド → 呼び出し元値を返す

ドラゴンボールでたとえると、引数は「管理画面から悟空へ戦士情報を登録すること」です。
戻り値は「悟空から現在の名前や戦闘力を報告してもらうこと」です。

この「行きは引数、帰りは戻り値」という感覚を持つと、メソッドの役割がかなり整理しやすくなります。

Javaのしくみドラゴンボールでのイメージ
引数悟空へ情報を渡す
戻り値悟空から情報を受け取る
return報告結果を返す合図
void報告結果を返さない行動

戻り値を持つメソッドは型を書く

戻り値を持つメソッドでは、メソッド名の前に返す値の型を書きます。

たとえば、戦士の名前を返すなら String 型です。

String getName()
{
    System.out.println("戦士の名前を調べました。");
    return name;
}

戦闘力を返すなら int 型です。

int getPower()
{
    System.out.println("戦闘力を調べました。");
    return power;
}

流派の印や流派名を返すなら、どちらも文字列なので String 型です。

String getStyleMark()
{
    System.out.println("流派の印を調べました。");
    return styleMark;
}

String getStyleName()
{
    System.out.println("流派名を調べました。");
    return styleName;
}

このとき、String や int が戻り値の型です。

返したい情報戻り値の型メソッド例
戦士の名前StringgetName()
戦闘力intgetPower()
流派の印StringgetStyleMark()
流派名StringgetStyleName()

ここで大切なのは、返す値の種類に合わせて型を書くことです。

名前、流派の印、流派名は文字列なので String。
戦闘力は整数なので int。

このように、「何を返したいか」によって戻り値の型が決まります。

return は値を返す合図

戻り値を返すときに使うのが return です。

return name;

これは、name の値を呼び出し元へ返します、という意味です。

また、次のように書けば、power の値を返します。

return power;

ドラゴンボールでたとえると、悟空オブジェクトが自分の登録データを確認し、「現在の名前はこちらです」「現在の戦闘力はこちらです」と報告書を返すようなイメージです。

return には、もうひとつ大事な特徴があります。

return が実行されると、そのメソッドの処理はそこで終了します。

役割内容
値を返すreturn の後ろに書いた値を呼び出し元へ返す
処理を終えるreturn が実行された時点でメソッドを終了する

最初は、return は「この値を返して、メソッドを終える合図」と覚えると分かりやすいです。

図:戻り値はメソッドから呼び出し元へ返る

この図が示していること

この図は、goku.getName() や goku.getPower() を呼び出したあと、メソッドの中で return が実行され、値が呼び出し元へ戻る流れを示しています。

getName() は name の値を返します。
getPower() は power の値を返します。

戻ってきた値は、warriorName や warriorPower という変数に代入されます。

この図から分かることは、戻り値はメソッドの中にある情報を呼び出し元へ持ち帰るしくみだということです。
メソッドを呼ぶだけで終わるのではなく、結果を受け取って次の処理に使えるところが大切です。

戻り値を持つメソッドを確認する

戻り値を持つメソッドを、サイヤ人管理プログラムで見ていきましょう。

ファイル名:Sample6.java

class Saiyan
{
    String name;
    int power;
    String styleMark;
    String styleName;

    String getName()
    {
        System.out.println("戦士の名前を調べました。");
        return name;
    }

    int getPower()
    {
        System.out.println("戦闘力を調べました。");
        return power;
    }

    String getStyleMark()
    {
        System.out.println("流派の印を調べました。");
        return styleMark;
    }

    String getStyleName()
    {
        System.out.println("流派名を調べました。");
        return styleName;
    }

    void setSaiyanData(String n, int p, String mark, String style)
    {
        name = n;
        power = p;
        styleMark = mark;
        styleName = style;

        System.out.println("戦士の名前を" + name + "に、戦闘力を" + power + "にしました。");
        System.out.println("流派の印を「" + styleMark + "」に、流派名を" + styleName + "にしました。");
    }

    void show()
    {
        System.out.println("戦士の名前は" + name + "です。");
        System.out.println("戦闘力は" + power + "です。");
        System.out.println("流派の印は「" + styleMark + "」です。");
        System.out.println("流派名は" + styleName + "です。");
    }
}

class Sample6
{
    public static void main(String[] args)
    {
        Saiyan goku = new Saiyan();

        goku.setSaiyanData("悟空", 9000, "亀", "亀仙流");

        String warriorName = goku.getName();
        int warriorPower = goku.getPower();
        String warriorStyleMark = goku.getStyleMark();
        String warriorStyleName = goku.getStyleName();

        System.out.println("調査結果");
        System.out.println("名前は" + warriorName + "、戦闘力は" + warriorPower + "でした。");
        System.out.println("流派の印は「" + warriorStyleMark + "」、流派名は" + warriorStyleName + "でした。");
    }
}

Saiyan クラスの役割

このプログラムでは、Saiyan クラスでサイヤ人戦士を表しています。

class Saiyan
{
    String name;
    int power;
    String styleMark;
    String styleName;

name は戦士の名前を保存するフィールドです。
power は戦闘力を保存するフィールドです。
styleMark は流派の印を保存するフィールドです。
styleName は流派名を保存するフィールドです。

ドラゴンボールでたとえると、Saiyan はサイヤ人を登録するための設計図です。
その中に、名前、戦闘力、流派の印、流派名といった戦士の情報を持たせています。

フィールド意味
name戦士の名前悟空
power戦闘力9000
styleMark流派の印
styleName流派名亀仙流

この4つの情報を設定したり、調べたりするために、いくつかのメソッドを用意しています。

setSaiyanData は値を受け取るメソッド

まず、setSaiyanData を見てみましょう。

void setSaiyanData(String n, int p, String mark, String style)
{
    name = n;
    power = p;
    styleMark = mark;
    styleName = style;

    System.out.println("戦士の名前を" + name + "に、戦闘力を" + power + "にしました。");
    System.out.println("流派の印を「" + styleMark + "」に、流派名を" + styleName + "にしました。");
}

このメソッドは、名前、戦闘力、流派の印、流派名を受け取って、フィールドに保存します。

goku.setSaiyanData("悟空", 9000, "亀", "亀仙流");

この呼び出しでは、実引数として 悟空、9000、亀、亀仙流 を渡しています。

実引数仮引数保存先
悟空nname
9000ppower
markstyleMark
亀仙流stylestyleName

このメソッドの戻り値の型は void です。

void setSaiyanData(String n, int p, String mark, String style)

void は、値を返さないという意味です。

つまり setSaiyanData は、呼び出し元から値を受け取って、悟空オブジェクトの情報を設定するメソッドです。
結果を呼び出し元へ返すのではなく、フィールドの状態を書き換えることが役割です。

ドラゴンボールでたとえると、サイヤ人登録データに「名前は悟空、戦闘力は9000、流派の印は亀、流派名は亀仙流」と登録する処理です。

getName は名前を返すメソッド

次に getName を見てみましょう。

String getName()
{
    System.out.println("戦士の名前を調べました。");
    return name;
}

このメソッドは、String 型の値を返します。

String getName()

メソッド名の前に String があるので、このメソッドは文字列を返すメソッドです。

中では、次の処理をしています。

順番処理内容
1表示する戦士の名前を調べました。
2return name;name の値を呼び出し元へ返す

たとえば name に 悟空 が入っていれば、getName は 悟空 を返します。

main メソッドでは、次のように戻り値を受け取っています。

String warriorName = goku.getName();

この1行では、次の流れが起きています。

順番処理内容
1goku.getName() を呼ぶ名前を調べるメソッドを実行する
2return name; が実行されるname の値が返る
3warriorName に代入される返ってきた 悟空 が入る

つまり、getName はただ表示するだけではありません。
name の値を呼び出し元へ返し、その値を変数 warriorName に入れて使えるようにしています。

getPower は戦闘力を返すメソッド

getPower も同じ考え方です。

int getPower()
{
    System.out.println("戦闘力を調べました。");
    return power;
}

このメソッドは、int 型の値を返します。

int getPower()

戦闘力は整数なので、戻り値の型は int です。

中では、次のような流れで処理されます。

順番処理内容
1表示する戦闘力を調べました。
2return power;power の値を呼び出し元へ返す

main メソッドでは、次のように受け取っています。

int warriorPower = goku.getPower();

この1行では、getPower の戻り値が warriorPower に入ります。

呼び出し戻り値代入先
goku.getName()name の値warriorName
goku.getPower()power の値warriorPower

このように、戻り値は変数に代入して使えます。

getStyleMark と getStyleName は流派情報を返すメソッド

今回のプログラムでは、流派情報も戻り値として返せるようにしています。

String getStyleMark()
{
    System.out.println("流派の印を調べました。");
    return styleMark;
}

String getStyleName()
{
    System.out.println("流派名を調べました。");
    return styleName;
}

どちらも String 型の値を返すメソッドです。

メソッド戻り値の型返すフィールド
getStyleMark()StringstyleMark
getStyleName()StringstyleName

main メソッドでは、次のように戻り値を受け取っています。

String warriorStyleMark = goku.getStyleMark();
String warriorStyleName = goku.getStyleName();

この2行によって、goku オブジェクトの中にある styleMark と styleName の値を、呼び出し元の変数に取り出せます。

呼び出し戻り値代入先
goku.getStyleMark()styleMark の値warriorStyleMark
goku.getStyleName()styleName の値warriorStyleName

流派情報を戻り値として受け取る

この記事では、流派を表す情報として styleMark と styleName を使います。

styleMark は、流派を短く表す印です。
styleName は、流派の正式な名前です。

styleMarkstyleName
亀仙流
鶴仙流
武泰斗流
カリン流
ピッコロ魔族流
神流(ナメック流)
惑星戦士流
北の界王流

Sample6.java では、悟空の流派を次のように設定しています。

フィールド設定値
styleMark
styleName亀仙流

そのあと、getStyleMark() と getStyleName() によって、設定された流派情報を呼び出し元へ返しています。

ドラゴンボールでたとえると、悟空オブジェクトに「現在の流派を報告して」と確認し、悟空が「印は亀、流派名は亀仙流です」と返してくれるようなイメージです。

実行結果

Sample6.java を実行すると、次のような結果になります。

戦士の名前を悟空に、戦闘力を9000にしました。
流派の印を「亀」に、流派名を亀仙流にしました。
戦士の名前を調べました。
戦闘力を調べました。
流派の印を調べました。
流派名を調べました。
調査結果
名前は悟空、戦闘力は9000でした。
流派の印は「亀」、流派名は亀仙流でした。

この実行結果から、処理の流れが見えてきます。

最初に setSaiyanData で名前、戦闘力、流派の印、流派名を設定しています。
次に getName で名前を調べ、その値を warriorName に入れています。
getPower で戦闘力を調べ、その値を warriorPower に入れています。
さらに getStyleMark と getStyleName で流派情報を調べ、それぞれの変数に入れています。
最後に、受け取った値を使って調査結果を表示しています。

ドラゴンボールでたとえると、次のような流れです。

プログラムの処理ドラゴンボールでたとえると
setSaiyanData("悟空", 9000, "亀", "亀仙流")サイヤ人登録データに悟空の情報を登録する
getName()戦士の名前を確認して報告する
getPower()戦闘力を確認して報告する
getStyleMark()流派の印を確認して報告する
getStyleName()流派名を確認して報告する
表示処理報告書として結果を読み上げる

図:戻り値は変数に入れて再利用できる

この図が示していること

この図では、goku.getName()、goku.getPower()、goku.getStyleMark()、goku.getStyleName() によって返された値が、呼び出し元の変数に入る流れを示しています。

戻り値を変数に入れると、その場で表示して終わるだけではなく、あとから別の処理でも使えるようになります。

ここから分かるのは、戻り値は「結果を受け取るためのしくみ」であり、受け取った値を再利用できるところに大きな意味があるということです。

戻り値は変数に入れて使える

戻り値の便利なところは、返ってきた値を呼び出し元で使えることです。

String warriorName = goku.getName();
int warriorPower = goku.getPower();
String warriorStyleMark = goku.getStyleMark();
String warriorStyleName = goku.getStyleName();

この4行では、戻り値をそれぞれ変数に入れています。

戻り値を返す処理返ってくる値受け取る変数
goku.getName()name の値warriorName
goku.getPower()power の値warriorPower
goku.getStyleMark()styleMark の値warriorStyleMark
goku.getStyleName()styleName の値warriorStyleName

変数に入れることで、その値をあとから使えます。

たとえば、今回のプログラムでは表示に使っています。

System.out.println("名前は" + warriorName + "、戦闘力は" + warriorPower + "でした。");
System.out.println("流派の印は「" + warriorStyleMark + "」、流派名は" + warriorStyleName + "でした。");

戻り値は、表示だけでなく、計算や条件分岐にも使えるようになります。

たとえば今後、戦闘力が一定以上なら強敵と戦える、戦闘力が低ければ修行させる、流派によって表示する説明を変える、という判断にもつなげられます。

ドラゴンボールでたとえると、悟空から戦闘力の報告を受け取り、その報告をもとに次の修行メニューや戦闘配置を決められるようになるイメージです。

戻り値を使わずに呼び出すこともできる

戻り値があるメソッドは、必ず変数に代入しなければならないわけではありません。

たとえば、次のように呼び出すこともできます。

goku.getPower();

この場合、getPower メソッドの中身は実行されます。

int getPower()
{
    System.out.println("戦闘力を調べました。");
    return power;
}

そのため、戦闘力を調べました。という表示は行われます。

ただし、return power; によって返された値は、呼び出し元で受け取られていません。
つまり、戻り値は返ってきているけれど、使われずに終わっています。

呼び出し方戻り値の扱い
int warriorPower = goku.getPower();戻り値を変数に入れて使う
goku.getPower();メソッドは実行されるが、戻り値は使わない

戻り値を使わない呼び出しもできますが、getName や getPower のようなメソッドは、返ってきた値を使うために用意することが多いです。

ドラゴンボールでたとえると、悟空が戦闘力を報告してくれたのに、その報告書を読まずに置いておくような状態です。
動きとしては間違いではありませんが、せっかくなら受け取った結果を活用したほうが便利です。

戻り値がないメソッドでは void を使う

戻り値を返さないメソッドでは、戻り値の型のところに void を書きます。

Sample6.java では、setSaiyanData と show が void のメソッドです。

void setSaiyanData(String n, int p, String mark, String style)

void show()

void は、値を返さないという意味です。

メソッド戻り値主な役割
getName()あり名前を返す
getPower()あり戦闘力を返す
getStyleMark()あり流派の印を返す
getStyleName()あり流派名を返す
setSaiyanData(String n, int p, String mark, String style)なし名前、戦闘力、流派情報を設定する
show()なし名前、戦闘力、流派情報を表示する

setSaiyanData は、名前、戦闘力、流派の印、流派名を設定することが目的です。
show は、現在の状態を表示することが目的です。

どちらも、呼び出し元へ値を返す必要がないので void を使っています。

void のメソッドでも return; は書ける

戻り値のない void メソッドでも、何も値を返さない return; を書くことはできます。

たとえば、次のような形です。

void setSaiyanData(String n, int p, String mark, String style)
{
    name = n;
    power = p;
    styleMark = mark;
    styleName = style;

    System.out.println("戦士の名前を" + name + "に、戦闘力を" + power + "にしました。");
    System.out.println("流派の印を「" + styleMark + "」に、流派名を" + styleName + "にしました。");

    return;
}

この return; は、ここでメソッドを終了して呼び出し元へ戻ります、という意味です。

ただし、この例では return; がなくても、最後の } まで進めば自然にメソッドは終わります。
そのため、今回のような単純な処理では return; を省略しても問題ありません。

書き方意味
return 値;値を返してメソッドを終える
return;値を返さずにメソッドを終える
void メソッドの最後まで進む値を返さずに自然に終わる

ここで注意したいのは、戻り値の型が int や String のメソッドでは、基本的にその型に合う値を return で返す必要があることです。

たとえば、int getPower() なら int 型の値を返します。

return power;

String getName() なら String 型の値を返します。

return name;

型と返す値が対応しているかを見ることが大切です。

引数と戻り値は逆向きのやり取り

引数と戻り値は、メソッドを理解するうえでとても重要な組み合わせです。

しくみ向き役割
引数呼び出し元 → メソッドsetSaiyanData("悟空", 9000, "亀", "亀仙流")値を渡す
戻り値メソッド → 呼び出し元getName(), getPower()値を返す

setSaiyanData は、呼び出し元から 悟空、9000、亀、亀仙流 を受け取ります。

goku.setSaiyanData("悟空", 9000, "亀", "亀仙流");

これは、呼び出し元からメソッドへ情報を送っています。

一方、getName、getPower、getStyleMark、getStyleName は、メソッドから呼び出し元へ値を返します。

String warriorName = goku.getName();
int warriorPower = goku.getPower();
String warriorStyleMark = goku.getStyleMark();
String warriorStyleName = goku.getStyleName();

これは、メソッドから呼び出し元へ情報が戻ってきています。

Javaのしくみドラゴンボールでたとえると
引数管理画面から悟空へ戦士データを渡す
戻り値悟空から管理画面へ現在の状態を報告する

この2つを使えるようになると、メソッドは一方通行の処理ではなく、情報をやり取りするしくみとして見えてきます。

図:引数と戻り値は逆向きのやり取り

この図が示していること

この図は、引数と戻り値の向きの違いを示しています。

setSaiyanData("悟空", 9000, "亀", "亀仙流") では、呼び出し元から goku オブジェクトへ値を渡しています。
これは引数の流れです。

一方、getName() や getPower() では、goku オブジェクトの中にある値が呼び出し元へ返ってきます。
これは戻り値の流れです。

この図から分かることは、メソッドは値を受け取るだけでなく、処理結果を返すこともできるということです。

戻り値を使うと処理を広げられる

戻り値を使えるようになると、メソッドの結果をあとで利用できます。

たとえば getPower が 9000 を返した場合、その値は次のようなことに使えます。

活用例内容
表示に使う戦闘力は9000でした。と表示する
計算に使う戦闘力に修行後の上昇量を足す
条件分岐に使う戦闘力が一定以上なら強敵に挑む
別のメソッドに渡す取得した戦闘力を別の処理で使う

今回の Sample6.java では、戻り値を表示に使っています。

System.out.println("名前は" + warriorName + "、戦闘力は" + warriorPower + "でした。");
System.out.println("流派の印は「" + warriorStyleMark + "」、流派名は" + warriorStyleName + "でした。");

今はシンプルな表示だけですが、戻り値の本当の便利さは、受け取った結果を次の処理につなげられるところにあります。

ドラゴンボールでたとえると、悟空から返ってきた戦闘力報告を見て、次のような判断につなげられます。

戦闘力判断
9000以上強敵との戦闘に参加できる
5000以上追加修行してから出撃する
3000未満まず回復や基礎修行を優先する

このように、戻り値はプログラムに「次の判断材料」を与えてくれます。

メソッドは処理するだけでなく結果を返せる

戻り値を学ぶと、メソッドの見え方が少し変わります。

戻り値を知らない段階では、メソッドは「処理を実行するもの」「画面に表示するもの」と見えやすいです。

しかし戻り値が分かると、メソッドは「結果を作って返す部品」として使えるようになります。

メソッドの見方内容
戻り値なし処理を実行して終わる
戻り値あり処理した結果を呼び出し元へ返す

getName、getPower、getStyleMark、getStyleName は、ただ表示するためだけのメソッドではありません。

名前、戦闘力、流派の印、流派名という情報を、呼び出し元で使える形にして返すメソッドです。

ここが戻り値の大切なところです。

いちばん大事な感覚

メソッドの戻り値と使い方で大切なのは、次の感覚です。

ポイント内容
戻り値メソッドから呼び出し元へ返される値
戻り値の型返す値の種類をメソッド名の前に書く
return値を返してメソッドを終了する
変数への代入戻り値は呼び出し元で受け取って使える
void値を返さないメソッドに使う
引数との違い引数は渡す、戻り値は返す

ドラゴンボールでたとえると、setSaiyanData は悟空に名前、戦闘力、流派情報を登録するための命令です。
getName、getPower、getStyleMark、getStyleName は、悟空から名前、戦闘力、流派情報を報告してもらうための命令です。

こちらから値を渡すだけでなく、メソッドから結果を返してもらえるようになると、プログラムの組み立て方が一気に広がります。

メソッドは、ただ処理を実行するだけのものではありません。
必要な情報を受け取り、処理を行い、その結果を呼び出し元へ返すこともできる、Javaのとても大切な部品です。