コマンドライン引数と配列

前節までで、変数とは何であるのかを紹介しました。本節からは、複数の変数を一塊として扱う、「配列」について紹介します。

配列とはなんだろうか

通常、単に変数というと、値は一つしか持てません。では、電話番号を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];	// どちらも同じ

配列の定義

配列の定義方法をまとめます:

1. データ型名[] 変数名; 又は データ型名 変数名[];
まず配列の個々の要素に保持できるデータ型と、この配列を参照する変数名を指定します。
2. 変数名 = new データ型名[要素の個数];
この配列に、指定された個数ぶんだけ要素を確保します。データ型によって、使うメモリの大きさが変わるので、ここでもデータ型名を指定しています。「このデータ型の要素をここで指定した個数ぶんだけ、新たに作り、この変数名で参照します」という程度に解釈してください。
3. 変数名[インデックス] = 値;
値の代入は、通常の変数と同じことです。ただし、指定するインデックス(要素の番号)は、 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] で参照できます。

サンプル1

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 こんにちは!
こんにちは!

この例で見たとおり、引数を変えると、ソースコードを書き換えなくても、実行結果が変わります。一般に、引数は、プログラムの実行時に、プログラムへパラメタを動的に与える仕組みです。

サンプル2

次の例は、コマンドライン引数から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" という種類のエラーが報告されていますが、これは、「配列のインデックスが限界を越えました」というほどの意味になります。

配列は、プログラミング言語ならば、必要不可欠なものです。また、コマンドラインから引数を受け取ることも、ちょっとしたことにはなかなか便利なやり方です。覚えておくと良いでしょう。



Copyright © 2001 SUGAI, Manabu. All Rights Reserved.