前節までで、変数とは何であるのかを紹介しました。本節からは、複数の変数を一塊として扱う、「配列」について紹介します。
通常、単に変数というと、値は一つしか持てません。では、電話番号を5個扱う場合は、どんな変数が必要でしょうか?
案1: String tel1, tel2, tel3, tel4, tel5;
間違ってはいませんが、いかにも美しくありません。そこで登場するのが配列です。配列ならば、次のように保持できます:
String[] tels; // 宣言 tels = new String[5]; // 生成
これで、 tels[0]
から tels[4]
まで5つの変数が自動的に作成されました。これらの変数をまとめて参照するときは変数 tels
を使います。値の代入は普通の変数と同じように行います。
角括弧は配列変数名 tels
にくっつけて書いても同じです:
String tels[]; // 宣言 tels = new String[5]; // 生成
宣言と生成を分けて書きましたが、基本データ型変数の宣言と初期化と同じく、次のように書いても同じです。
String[] tels1 = new String[5]; String tels2[] = new String[5]; // どちらも同じ
配列の定義方法をまとめます:
データ型名[] 変数名;
又は データ型名 変数名[];
変数名 = new データ型名[要素の個数];
変数名[インデックス] = 値;
0
から始まります。従って、配列を new
するときに指定した要素の個数を N
個だとすると、インデックスで指定可能な数値は、 0
から N-1
です。TestArray.java
:
class TestArray { public static void main(String[] args) { String[] aStr; aStr = new String[2]; aStr[0] = "こんにちは"; aStr[1] = "さようなら"; System.out.println("出会い:" + aStr[0]); System.out.println("別れ:" + aStr[1]); } }
データ型が String
の配列 aStr[]
が作成されています。要素数は2つ(aStr[0]
と aStr[1]
)です。
C:\java>javac TestArray.java C:\java>java TestArray 出会い:こんにちは 別れ:さようなら C:\java>
Srintg[] args
- コマンドライン引数では、 main()
メソッドの引数に指定されている配列 Srintg[] args
は何のためのものでしょう?
答えは、コマンドライン引数です。コマンドラインから、 Java アプリケーションにパラメタを渡すことが出来ます。
コマンドライン引数は、 main()
メソッド内で利用できるパラメタを与える仕組みです。コマンド ラインで実行時に渡された文字列が String
型の配列 args
に代入されます。例えば、コマンド ラインから渡された文字列の最初のものは args[0]
で参照できます。
TestArgs.java
:
class TestArgs { public static void main(String[] args) { System.out.print(args[0]); } }
上のサンプルは、コマンドライン引数の第一番目のものを出力します。
実行例は次のようになります。コマンドラインの引数に Hello!
を与えています。
C:\java>javac TestArgs.java C:\java>java TestArgs Hello! Hello! C:\java>
期待通りの結果です。次の実行例は、コマンドライン引数に こんにちは!
を与えたものです。
C:\java>java TestArgs こんにちは! こんにちは!
この例で見たとおり、引数を変えると、ソースコードを書き換えなくても、実行結果が変わります。一般に、引数は、プログラムの実行時に、プログラムへパラメタを動的に与える仕組みです。
次の例は、コマンドライン引数から1つの数字を受け取って、その 1.05 倍を出力するものです。
Multiply.java
:
class Multiply { public static void main(String[] args) { double a = Double.parseDouble(args[0]); double b = 1.05; System.out.println(a * b); } }
コマンドライン引数を args[0]
で参照しています。Double.parseDouble()
は、 String
型の値を読取って double 型に解釈した値を返します。返された値は左辺の変数に代入されます。今の場合は、 args[0]
を double 型に解釈した値が a
に代入されます。
実行例は次のようになります。コンパイルした後、実行時に、コマンドライン引数から1つの値 100 と 1980 を与えます。
C:\java>javac Multiply.java C:\java>java Multiply 100 105.0 C:\java>java Multiply 1980 2079.0
b
の値はプログラムの中に 1.05 と書き込んでしまいました。この値もコマンドライン引数から代入するように変更してみましょう。
Multiply2.java
:
class Multiply2 { public static void main(String[] args) { double a = Double.parseDouble(args[0]); double b = Double.parseDouble(args[1]); System.out.println(a * b); } }
コマンドライン引数の2番目のものが args[1]
で参照され、その値を double 型に解釈したものが b
に代入されます。
実行例は次のようになります。複数のコマンドライン引数は半角スペースで区切ります。逆に言えば、半角スペースが混じると、別の args[?]
に代入されることになります。
C:\java>javac Multiply2.java C:\java>java Multiply2 100 0.5 50.0 C:\java>java Multiply2 980 4 3920.0 C:\java>
ArrayIndexOutOfBoundsException
上のサンプルに何も引数を与えないで実行してみましょう。
C:\java>java TestArgs Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException at TestArgs.main(TestArgs.java:3) C:\java>
何も引数を与えていないので、配列が作られていないのですが、第一引数を出力しようとしたから発生した状況です。無いものをよこせと言ったようなものです。
"ArrayIndexOutOfBoundsException" という種類のエラーが報告されていますが、これは、「配列のインデックスが限界を越えました」というほどの意味になります。
配列は、プログラミング言語ならば、必要不可欠なものです。また、コマンドラインから引数を受け取ることも、ちょっとしたことにはなかなか便利なやり方です。覚えておくと良いでしょう。