メソッドの引数

メソッドには、もっと柔軟で便利な使い方が有ります。 呼び出し元から情報(値)を受け取り、それに応じて処理を行うことができるのです。

引数を持つメソッド

メソッドが呼び出されるときに、呼び出し元から値を受け取ることができます。 そのために使われるのが引数です。

メソッド宣言には引数リストという部分が有りました。 ここに、引数を記述するのです。

構文 : メソッド宣言(再掲)
    static  戻り値の型  メソッド名(引数リスト){
        文1
        文2
        ...
        return 式;
    }

実際に、引数を持つメソッドを見てみましょう。 これは、指定された回数だけメッセージを表示するメソッドです。

    static void printMessage(String msg, int n){
        for(int i = 0; i < n; i++){
            System.out.println(msg);
        }
    }
表 9-2 : printMessageメソッド
戻り値の型 メソッド名 引数リスト
void printMessage String msg, int n

引数は引数リストの中に0個以上の何個でも記述することができ、2個以上の場合は、カンマ(,)で区切って記述します。 引数の型は基本型、参照型のいずれも指定することができます。 printMessageメソッドの引数は、String型のmsgとint型のnとなっています。 例えば、「ゲームのやり過ぎに注意!」と4回表示させる場合、呼び出し元から"ゲームのやり過ぎに注意!"という文字列と回数を表す4が渡されて、それぞれmsgとnに格納されることになります。

"ゲームのやり過ぎに注意!"という文字列は、Stringクラスのインスタンスです。 ですから、厳密に言えば、msgに格納されるのは、"ゲームのやり過ぎに注意!"という文字列への参照になります。 しかし、このことについては、今は気にする必要はありません。

メソッド本体では、受け取った引数に応じて、処理を行うことができます。 printMessageメソッドでは、for文の条件「i < n」でnが利用されています。 nの値が4なら、msgの内容が4回表示されることになります。

  • メソッドは、引数を使って呼び出し元から値を受け取ることができる。
  • メソッド本体では、受け取った値に応じた処理をすることができる。

引数を持つメソッドを呼び出す

printMessageメソッドを呼び出して、「ゲームのやり過ぎに注意!」と4回表示させる場合、次のように記述します。

        printMessage("ゲームのやり過ぎに注意!", 4);

メソッド宣言での引数のことを特に仮引数(formal parameter)と呼び、メソッド呼び出しでの引数は実引数(actual argument)と呼びます。 ここでは、実引数として"ゲームのやり過ぎに注意!"と4を渡して呼び出しています。 1番目の仮引数は1番目の実引数で、2番目の仮引数は2番目の実引数で初期化されます。 従って、msgは"ゲームのやり過ぎに注意!"で、nは4で初期化されることになります。

図 9-2 : 仮引数と実引数の対応

実引数の型・個数・並び順は、仮引数のそれと一致していなければなりません。 従って、以下のような呼び出し方はすべてコンパイルエラーとなります。

        printMessage("ゲームのやり過ぎに注意!", 4.0);    //引数の型が違う
        printMessage("ゲームのやり過ぎに注意!");           //引数の個数が違う
        printMessage(4, "ゲームのやり過ぎに注意!");       //引数の並び順が違う

実引数の型・個数・並び順は、仮引数のそれと一致していなければならない。

値を受け取ったメソッドは、仮引数の値に応じて、処理を行うことができます。 そして、reuturn文が実行されるかメソッドの処理が最後まで到達すると、処理は呼び出し元に戻ります。 printMessageメソッドでは、msgが表す文字列がn回表示された後、メソッドの最後に到達して、呼び出し元に戻ります。

引数を持つメソッドを使ってみる

printMessageメソッドを試してみましょう。 このプログラムは「ゲームのやり過ぎに注意!」を4回、「宿題は終わったかな。」を6回表示します。

MethodSample02.java
class MethodSample02 {
    static void printMessage(String msg, int n){
        for(int i = 0; i < n; i++){
            System.out.println(msg);
        }
    }

    public static void main(String[] args) {
        printMessage("ゲームのやり過ぎに注意!", 4);
        printMessage("宿題は終わったかな。", 6);
    }
}
MethodSample02の実行結果
ゲームのやり過ぎに注意!
ゲームのやり過ぎに注意!
ゲームのやり過ぎに注意!
ゲームのやり過ぎに注意!
宿題は終わったかな。
宿題は終わったかな。
宿題は終わったかな。
宿題は終わったかな。
宿題は終わったかな。
宿題は終わったかな。

mainメソッドで、 printMessage("ゲームのやり過ぎに注意!", 4); が実行されると、printMessageメソッドの中でfor文が実行され、「ゲームのやり過ぎに注意!」が4回表示されます。 今回はreturn文が有りませんが、メソッドの最後に到達してmainメソッドに戻ります。 この後は、 printMessage("宿題は終わったかな。", 6); が実行されます。

図 9-3 : printMessageメソッドの呼び出し

いろいろな実引数

実引数には、リテラルだけでなく、変数や式を指定することもできます。 実引数のいくつかの例を見ておきましょう。

MethodSample03.java
class MethodSample03 {
    static void decideSign(double a){
        if(a > 0){
            System.out.println(a + " は正の数です。");
        }else if(a < 0 ){
            System.out.println(a + " は負の数です。");
        }else{
            System.out.println(a + " は0です。");
        }
    }

    public static void main(String[] args) {
        decideSign(0.1);    //浮動小数点数リテラルを渡す
        decideSign(8);       //整数リテラルを渡す。(型変換)

        double v = -2.4;
        decideSign(v);       //変数を渡す。
        decideSign(v+5);   //式を渡す。
    }
}
MethodSample03の実行結果
0.1 は正の数です。
8.0 は正の数です。
-2.4 は負の数です。
2.6 は正の数です。

decideSignメソッドは、与えられた数が正の数・負の数・0のいずれであるかを判定して、結果を表示するメソッドです。

表 9-3 : decideSignメソッド
戻り値の型 メソッド名 引数リスト
void decideSign double a

mainメソッド内でのdecideSignの呼び出し方を見ていきましょう。

        decideSign(0.1);    //浮動小数点数リテラルを渡す

浮動小数点数リテラルの0.1を渡しています。 これは、ごく当たり前の呼び出し方ですね。

        decideSign(8);       //整数リテラルを渡す。(型変換)

整数リテラルの実引数はint型と見なされます。 decideSignの仮引数はdouble型ですが、int型の実引数を指定することができます。 この場合、int型の8は自動的にdouble型の8.0に型変換されてから、仮引数のaに代入されます。 これは、大きなサイズの型の変数に、小さなサイズの型の値を代入することができたのと同じことです。

        double v = -2.4;
        decideSign(v);       //変数を渡す。

実引数には変数を指定することもできます。 この場合、仮引数aには実引数vの値の-2.4が代入されます。 このように、仮引数と実引数の変数名は同じでなくてもかまいません。

        decideSign(v+5);   //式を渡す。

さらに、実引数には式を指定することもできます。 この場合、5がdouble型に型変換されて、v+5.0が計算され、その結果の2.6が仮引数aに代入されることになります。

実引数には、変数や式を指定することができる。