引数

目次
  • 解説
  • 1. 引数のあるメソッド
  • 2. 引数のみ異なるメソッド
  • 3. 戻り値と引数のまとめ
問題に挑戦!
進捗を変更する




解説

1. 引数のあるメソッド


引数(ひきすう)とは、メソッド内の処理で使用する値をメソッドの外から与える方法です。次のサンプルコードは、practiceCalculationの中で使用する3つの数値を呼び出し側から渡して計算させています。

    static void practiceArguments() {
        int result = practiceCalculation(100, 20, 3); // 3つの数値を渡す
        Logger.out(result);
    }

    static int practiceCalculation(int a, int b, int c) {
        return a + b + c; // 受け取った3つの数値が入った変数を計算に使用
    }
[2020/12/31 12:34:56.789] 123 // 100 + 20 + 3 の結果

メソッドの宣言側では、丸括弧内に引数受け取るための変数仮引数)を宣言します。この例ではint型の3つの a, b, c という変数を宣言しています。なお、呼び出す側では必ず対応する値を渡す必要があるため、仮引数初期化初期値という考え方は不要となります。

メソッドの呼出側では、丸括弧内に引数実際の値実引数)を入れます。実引数を変えて呼び出せば、同じメソッドでも引数の内容に応じた異なる結果を生み出すことが可能となります。

次のサンプルコードでは、呼び出す際に渡す引数を変更して2回呼び出しています。

    static void practiceArguments() {
        int result = practiceCalculation(100, 20, 3);
        Logger.out(result);
        result = practiceCalculation(1, 2, 3); // 異なる引数を渡す
        Logger.out(result);
    }

    static int practiceCalculation(int a, int b, int c) {
        return a + b + c; // 引数の内容によって異なる結果となる
    }
[2020/12/31 12:34:56.789] 123 // 100 + 20 + 3 の結果
[2020/12/31 12:34:56.789] 6   // 1 + 2 + 3 の結果

2. 引数のみ異なるメソッド


同じメソッド名同じ戻り値の型同じ引数の型と数のメソッドは複数作れません。しかし、引数の型と数の組み合わせが異なるメソッドは別のメソッドとして複数作ることが可能です。

    static void practiceArguments() {
        int result = practiceCalculation(100, 20, 3);
        Logger.out(result);
        result = practiceCalculation(1, 2, 3);
        Logger.out(result);
        result = practiceCalculation(10, 20);
        Logger.out(result);
    }

    static int practiceCalculation(int a, int b, int c) { // int型3つ
        return a + b + c;
    }

    static int practiceCalculation(int a, int b) { // int型2つ
        return a - b; // 同名で同じ戻り値型でも引数の数により処理が異なる
    }
[2020/12/31 12:34:56.789] 123 // 100 + 20 + 3 の結果
[2020/12/31 12:34:56.789] 6   // 1 + 2 + 3 の結果
[2020/12/31 12:34:56.789] -10 // 10 - 20 の結果

この仕組みをオーバーロードと呼びます。メソッドを作るときにオーバーロードを活用する機会が最初はあまりないかもしれませんが、用意された様々なメソッドを使用する際には、同じ名前のメソッドでも引数の型と数によって処理内容が異なることに注意しましょう。

3. 戻り値と引数のまとめ


ここで改めて、メソッド宣言部構造を確認しておきましょう。

なお、引数と戻り値は両方ある必要は無く、どちらか一方しかないメソッドも成立します。

問題

確認問題


確認問題1

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

実践問題


(1)VSCodeを起動し、ヘッダーメニューの「ファイル」>「フォルダーを開く...」から、「workspace_java_basic」プロジェクトを開いてください。
(2)workspace_java_basic」プロジェクトの「net.digskill.structure
パッケージの「Structure.java」を開いてください。
※無い場合は「メソッドと戻り値」を先に学習しましょう。
(3)Structure」クラス内に次のサンプルコードのメソッドをコピー&ペーストし、
mainから呼び出せるようにして、「F5」で実行できることを確認してください。
(4)コメント行に記された各問題文に対し、答えとなるプログラムコードを
問題文の次の空白行以降に書き込みまたは書き換えて
、「F5」で実行してください。
    static void questionMethod() {
        // (問1)引数なしで、ターミナルに「こんにちは」を
        // 出力するメソッドmethodQ1をクラス内に作成し、
        // 次の空白行で呼び出してください。


        // (問2)引数なしで、戻り値として「こんばんは」を
        // 戻すメソッドmethodQ2をクラス内に作成し、
        // 戻り値をresultQ2で受け取るよう変更してください。
        String resultQ2 = "";
        Logger.out(resultQ2);

        // (問3)下記の引数を受け取り、下記の処理を行う
        // メソッドmethodQ3をこのクラス内に作成し、
        // 戻り値をresultQ3で受け取るよう変更してください。
        // 【引数1】50
        // 【引数2】200
        // 【処理】引数どうしを掛け算した結果を戻り値として戻す
        int resultQ3 = 0;
        Logger.out(resultQ3);

        // (問4)下記の引数を受け取り、下記の処理を行う
        // メソッドmethodQ4をこのクラス内に作成し、
        // 戻り値をresultQ4で受け取るよう変更してください。
        // 【引数1】50000
        // 【引数2】2000000
        // 【処理】引数どうしを掛け算した結果を戻り値として戻す
        long resultQ4 = 0L;
        Logger.out(resultQ4);
    }
実行結果例を表示
[2020/12/31 12:34:56.789] こんにちは
[2020/12/31 12:34:56.789] こんばんは
[2020/12/31 12:34:56.789] 10000
[2020/12/31 12:34:56.789] 10000000000

正解


(問1)正解を表示
    static void questionMethod() {
        ~~ 省略 ~~
        methodQ1();
        ~~ 省略 ~~
    }

    static void methodQ1() {
        Logger.out("こんにちは");
    }

(問2)正解を表示
    static void questionMethod() {
        ~~ 省略 ~~
        String resultQ2 = methodQ2();
        Logger.out(resultQ2);
        ~~ 省略 ~~
    }

    static String methodQ2() {
        return "こんばんは";
    }

(問3)正解を表示
    static void questionMethod() {
        ~~ 省略 ~~
        int resultQ3 = methodQ3(50, 200);
        Logger.out(resultQ3);
        ~~ 省略 ~~
    }

    static int methodQ3(int a, int b) {
        return a * b;
    }

(問4)正解を表示
    static void questionMethod() {
        ~~ 省略 ~~
        long resultQ4 = methodQ4(50000, 200000);
        Logger.out(resultQ4);
        ~~ 省略 ~~
    }

    // 引数の型が両方ともintの場合、掛け算の結果もintとなり、
    // オーバーフローを起こして想定外の結果となる。
    // また、戻り値の型がintの場合、longどうしの掛け算の
    // 結果がlongであるため、構文エラーとなる。
    static long methodQ4(long a, long b) {
        return a * b;
    }

正解プログラムコード全文を表示
    static void questionMethod() {
        // (問1)引数なしで、ターミナルに「こんにちは」を
        // 出力するメソッドmethodQ1をクラス内に作成し、
        // 次の空白行で呼び出してください。
        methodQ1();

        // (問2)引数なしで、戻り値として「こんばんは」を
        // 戻すメソッドmethodQ2をクラス内に作成し、
        // 戻り値をresultQ2で受け取るよう変更してください。
        String resultQ2 = methodQ2();
        Logger.out(resultQ2);

        // (問3)下記の引数を受け取り、下記の処理を行う
        // メソッドmethodQ3をこのクラス内に作成し、
        // 戻り値をresultQ3で受け取るよう変更してください。
        // 【引数1】50
        // 【引数2】200
        // 【処理】引数どうしを掛け算した結果を戻り値として戻す
        int resultQ3 = methodQ3(50, 200);
        Logger.out(resultQ3);

        // (問4)下記の引数を受け取り、下記の処理を行う
        // メソッドmethodQ4をこのクラス内に作成し、
        // 戻り値をresultQ4で受け取るよう変更してください。
        // 【引数1】50000
        // 【引数2】2000000
        // 【処理】引数どうしを掛け算した結果を戻り値として戻す
        long resultQ4 = methodQ4(50000, 200000);
        Logger.out(resultQ4);
    }

    static void methodQ1() {
        Logger.out("こんにちは");
    }

    static String methodQ2() {
        return "こんばんは";
    }

    static int methodQ3(int a, int b) {
        return a * b;
    }

    static long methodQ4(long a, long b) {
        return a * b;
    }