メソッドと戻り値

目次
  • 解説
  • 1. 学習の準備
  • 2. 最も単純なメソッド
  • 3. メソッドの呼び出し
  • 4. 戻り値のあるメソッド
問題に挑戦!
進捗を変更する




解説

1. 学習の準備


下表のとおり学習用のクラスを作成して、その中にmainメソッドを作っておきましょう。

ファイル名Structure.java
パッケージ名(格納フォルダー)net.digskill.structure
クラス名Structure

これまでは「net.digskill」パッケージに直接Javaファイルを作成してきましたが、ここからはさらに1階層下の「net.digskill.structure」パッケージで学習を進めます。もしもこれまでのJavaファイルを整理したい方は、「net.digskill.syntax」パッケージを作成して、そこにドラッグ&ドロップで「net.digskill」直下のJavaファイルを移動しておきましょう。移動後には、すべてのファイルのpackage文を修正することを忘れないでください。また、「net.digskill.utility」パッケージはこれからも使用しますので、一緒に移動してしまわないように注意しましょう。

2. 最も単純なメソッド


メソッドについて「基礎知識 > Javaファイル内の構造 > メソッド(概要)」で概要を学習し、それ以降たくさん作成して使用してきましたが、改めてメソッドの構造と使い方を詳しく学習していきましょう。

ではまず、これまで通りメソッドを作成して動かしてみましょう。

    static void practiceSimpleMethod() {
        Logger.out("メソッド");
    }

これをmainメソッドから呼び出すとターミナルに「メソッド」と出力しますが、mainメソッド側には何も影響を及ぼしません。また、2行目の処理をそのままmainメソッドに書いても全く同じ結果となります。つまり、このメソッドは処理をブロックの中に移動して名前を付けただけ、ということになります。

この仕組みはとても単純ですが、たくさんの処理を用途や目的ごとにブロックとしてまとめ、名前を付けて整理することが可能です。また、たった1行の呼び出し部分を書くだけで、そのたくさんの処理を何度も実行させることができるなど、プログラムを効率的に書くためにはなくてはならない仕組みです。

3. メソッドの呼び出し


最も単純なメソッドはmainメソッドから呼び出していましたが、その中でLogger.outメソッドを呼び出していたように、mainメソッド以外からもメソッドを呼び出すことが可能です。

メソッドがメソッドを呼び出すときのプログラム全体の流れを見てみましょう。

    static void practiceSimpleMethod() {
        Logger.out("practiceSimpleMethod 開始");
        practiceNestedMethod_1();
        Logger.out("practiceSimpleMethod 終了");
    }

    static void practiceNestedMethod_1() {
        Logger.out("practiceNestedMethod_1 開始");
        practiceNestedMethod_1_1();
        practiceNestedMethod_1_2();
        Logger.out("practiceNestedMethod_1 終了");
    }

    static void practiceNestedMethod_1_1() {
        Logger.out("practiceNestedMethod_1_1 開始");
        Logger.out("practiceNestedMethod_1_1 終了");
    }

    static void practiceNestedMethod_1_2() {
        Logger.out("practiceNestedMethod_1_2 開始");
        Logger.out("practiceNestedMethod_1_2 終了");
    }
[2020/12/31 12:34:56.789] practiceSimpleMethod 開始
[2020/12/31 12:34:56.789] practiceNestedMethod_1 開始  
[2020/12/31 12:34:56.789] practiceNestedMethod_1_1 開始
[2020/12/31 12:34:56.789] practiceNestedMethod_1_1 終了
[2020/12/31 12:34:56.789] practiceNestedMethod_1_2 開始
[2020/12/31 12:34:56.789] practiceNestedMethod_1_2 終了
[2020/12/31 12:34:56.789] practiceNestedMethod_1 終了
[2020/12/31 12:34:56.789] practiceSimpleMethod 終了

メソッドAがメソッドBを呼び出す際、その時点でメソッドAは一旦中断します。そしてメソッドBに処理が移り、メソッドBのすべての処理が終了すると、メソッドAの処理が再開される、という流れが見て取れるでしょうか。

流れがわからない場合は、次の行番号の順にプログラムを追いかけてみましょう。
1 > 2 > 3 > 7 > 8 > 9 > 14 > 15 > 16 > 17 > 10 > 19 > 20 > 21 > 22 > 11 > 12 > 4 > 5

4. 戻り値のあるメソッド


最も単純なメソッドでは、呼び出し側に何も影響を及ぼしませんでした。今度は、メソッド内の処理の結果を呼び出し側に戻す戻り値のあるメソッドを作ってみましょう。

    static void practiceReturn() {
        String stringResult = practiceStringResult();
        Logger.out(stringResult);
        int intResult = practiceIntResult();
        Logger.out(intResult);
    }

    static String practiceStringResult() {
        return "戻り値";
    }

    static int practiceIntResult() {
        return 100 + 20 + 3;
    }
[2020/12/31 12:34:56.789] 戻り値
[2020/12/31 12:34:56.789] 123

practiceMethodから呼び出す、戻り値のあるメソッドを3つ追加しました。

まず注目したいのは、「practiceStringResult()」のようなメソッド呼び出しが、代入式の右辺に書かれていることです。この状態で実行されると、そのメソッド内の「return」に続く値が、呼び出し側の左辺の変数に代入されることになります。このreturn文により呼び出し側へ戻す値は、代入と同様に式の結果やメソッドの呼び出しにすることが可能です。

次に注目したいのは、それぞれのメソッド名の左側、つまり今までvoidと書いてあったところに型名が書かれていることです。これは戻り値の型であり、return文により呼び出し側へ戻す値の型を明示しています。これまでのvoid(空っぽ)は、戻り値無しを意味していたのです。

戻り値の型をvoid以外とした場合は、必ず、その型の値をメソッドの最後にreturn文で戻す必要があります。

問題

確認問題


確認問題1

この中で戻り値を持つメソッドとして正しくないものはどれか?