メソッドで引数の数を事前に設定したくないときがある。
例えば、入力した数字の平均値を出すというメソッドの時、何個入力するかはそのときどきで変えたい場合があるだろう。
そんなときに使えるのが、可変長引数だ。このページではJavaメソッドの可変長引数の使い方についてお伝えする。とはいえ、使い方は簡単だ。
目次
Javaメソッド最後の引数は可変長引数にもなる
可変長引数とは?
Javaのメソッドの最後の引数は可変長引数として使うこともできる。
可変長引数とは、メソッドの定義側でひとつ引数を設定しておくと、実際につかうときにいくつも引数を書けるということだ。
引数の数は決まっていないが、型が同じという引数があれば、この書き方が使える。
可変長の引数は配列に入れられて、メソッドに渡される。このため、メソッド側では配列と同じ扱いで、処理を行うことができる。
可変長引数の書き方
書き方を見てみよう。
呼び出す側の書き方は簡単だ。実引数N1から実引数Nnまでが可変長引数にあたる。
メソッド名(実引数A, 実引数B, … 実引数N1, 実引数N2, … 実引数Nn);
一方、呼び出されるメソッドの引数の定義では、最後の引数の型と識別子の間に、「…」を入れて書く。こうすれば、可変長だと宣言したことになる。
書き方の基本はこれだ。
1 2 3 4 5 |
修飾子 戻り値の型 メソッド名(型 識別子A, 型 識別子B, … , 型 … 識別子N) { 命令文; ・・・ return 式; } |
では、簡単なサンプルプログラムで確かめてみよう。
可変長の引数のサンプルプログラム
このサンプルプログラムは、クラスの生徒の体重の平均を表示する。クラス毎に人数が異なっても、メソッドの定義を変える必要はない。実引数の最後の体重を生徒の数に合わせて書けばよい。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
public class MethodWithLastFomalParameter { public static void main (String[] args) { printWeightAverage("クラスA", 35.6, 54.7);//[1] printWeightAverage("クラスB", 44.2, 35.6, 60.8, 54.7);//[2] printWeightAverage("クラスC", 44.2, 35.6, 60.8, 54.7, 99.9, 32.4);//[3] } private static void printWeightAverage(String className, double ... weights) {//[4] double sum = 0;//[5] for(double weight: weights) {//[6] sum += weight;//[7] } System.out.println("[8] " + className + ":(人数:" + weights.length + ")"); System.out.println("[9] 体重:" + sum / weights.length); } } |
実行結果
1 2 3 4 5 6 |
[8] クラスA:(人数:2) [9] 体重:45.150000000000006 [8] クラスB:(人数:4) [9] 体重:48.825 [8] クラスC:(人数:6) [9] 体重:54.6 |
サンプルプログラムの説明
それでは簡単にプログラムの解説をしてゆこう。
- [1] メソッド:printWeightAverageを2人の体重を引数として呼び出す
- [2] メソッド:printWeightAverageを4人の体重を引数として呼び出す
- [3] メソッド:printWeightAverageを6人の体重を引数として呼び出す
- [4] 可変長引数を持つメソッド:printWeightAverageを定義する
- [5] 変数:sumの宣言と初期化を行う
- [6] [7] 体重の合計を求める
- [8] クラスと人数を表示する
- [9] 体重の平均を表示する
メソッド側に渡される値を確認するサンプルプログラム
簡単にメソッドに渡される値が、配列だということを確認しておこう。
このサンプルプログラムではよく使う方法([ ])で、配列の要素の値を取り出し、その要素の値を表示している。
1 2 3 4 5 6 7 8 9 10 |
public class DumpLastFomalParameter { public static void main (String[] args) { printNumbers(101, 102, 103, 104, 105, 106);//[1] } private static void printNumbers(int ... numbers) {//[2] for (int index = 0; index < numbers.length; index ++) {//[3] System.out.println("[4] number[" + index + "] : " + numbers[index]); } } } |
実行結果
1 2 3 4 5 6 |
[4] number[0] : 101 [4] number[1] : 102 [4] number[2] : 103 [4] number[3] : 104 [4] number[4] : 105 [4] number[5] : 106 |
サンプルプログラムの説明
それでは簡単にプログラムの解説をしてゆこう。
- [1] メソッド:printNumbersを呼び出す
- [2] 可変長引数を持つメソッド:printNumbersを定義する
- [3] [4] 配列の要素の値をすべて表示する
まとめ
このページではJavaメソッドの可変長引数についてお伝えした。
使える場面は多いので、使い方は理解しておこう。
初歩的な質問かもしれませんが、
13行目、
System.out.println("[9] 体重:" + sum / weights.length);
ではなく
System.out.println("[9] 体重:" + + + sum / weights.length);
とするのはなぜですか?
ご愛読いただきありがとうございます。
(誤) System.out.println("[9] 体重:" + + + sum / weights.length);
(正) System.out.println("[9] 体重:" + sum / weights.length);
となります。
ご指摘いただきありがとうございました。
引き続き、ご愛読のほど、よろしくお願いいたします。