これまでのプログラムでは、 プログラムの動作に必要な情報はすべてプログラム中に 記述してきました。 しかし、中の情報を書き換えるたびにはいちいちソースコードを書き換え、 コンパイルしなおさなければならないため不便です。
コマンドライン引数 (ひきすう) (command line argument) を使うと、 プログラムを起動するときに 外部からプログラムに情報を与えることができます。 これにより、実行時にプログラムの動きを変えたり、 初期値をプログラムに渡すことができます。
UNIXやLinuxなどのOSにおいて、 コマンドライン引数は次のように使われます。
$ cp originalfile copiedfile
上の例のoriginalfileと copiedfileの部分がコマンドライン引数です。 cpコマンドにコピーするべきファイルと、 コピーされたときのファイル名を指定しています。 UNIXやLinuxのコマンドライン引数は、 スペースで引数を区切る約束になっています。
この機能はJavaのプログラムでも使うことができます。 例えば、プログラムが次のコマンドで起動されたとします。
$ java Program filename condition
通常の Java プログラムの実行コマンドに加えて、 filename と condition の 2 つの引数を与えています。
Java のプログラムの始めには public static void main(String[] args) という記述がありましたね。ここに
String[] args
という配列の宣言のような記述があることに気がついたでしょう。 コマンドライン引数は配列 args の要素として取り出すことができます。
以下のプログラムはコマンドライン引数の内容を取り出しそのまま表示するものです。 配列の使い方を忘れてしまった人は、前期の資料 を見て復習しましょう。
class ArgsList { public static void main(String[] args) { for (int i = 0; i < args.length; i++) System.out.println("args[" + i + "] の値は " + args[i]); } }
次のように実行してみましょう。
$ java ArgsList Saturday Night Fever
args の要素は文字列です。 この例では、args[0] には "Saturday" 、 args[1] には "Nighta" 、 args[2] には "Fever" が入ります。 このように「n 番目の引数」は args[n] として プログラム内で取り出すことができます。
コマンドラインから入力された数値に1だけを加えた値を表示する簡単なプログラムを 考えてみましょう。素直に考えると次のように書けるかも知れません。
class PlusOneFromArgs { public static void main(String[] args) { int answer; answer = args[0] + 1; System.out.println(answer); } }
しかし、上のプログラムをコンパイルすると、 次のようなコンパイルエラーになってしまいますね。
PlusOneFromArgs.java:4: この型は = には不適合です。java.lang.String から int には変換できません。 answer = args[0] + 1; ^
コマンドライン引数の宣言部分 String[] args をよく見ると、 配列 args には文字列が入っていることが分かります。 この配列は String すなわち文字列であることが分かります。 Java では変数には型があり、 整数や文字列などの型で決められたデータしか扱うことはできない、 ということを思い出してください。 文字列は、そのままでは数値として扱うことやその逆はできないのです。
例えば、仮にこのプログラムが動いたとして
java PlusOneFromArgs 10
のように実行し、引数に「10」と入力した場合、 args[0] は文字列の "10" となります。 文字列の "10" は、 '1' と '0' の文字が順番に並んだデータであり、 同じ「10」 でも、文字列の "10" と数値の 10 は計算機の中での扱いは別物なのです。 これを数値としての 10 に変換する必要があります。
数字の並んだ文字列を解釈し int 型整数に変換するには、 Integer.parseInt という機能を用います。
例えば、 文字列 args[0] を、 int 型の整数に変換し変数 a に代入するには次のように書きます。
a = Integer.parseInt(args[0]);
あとは a の値を用いて計算を行っていくことができます。 また、この Integer.parseInt(...) は、 以下のように式の一部としても書くことができます。
answer = Integer.parseInt(args[0]) + 1;
文字列からint型の値への変換を含んだ正しいプログラム全体を以下に示します。
class PlusOneFromArgs { public static void main(String[] args) { int answer; answer = Integer.parseInt(args[0]) + 1; System.out.println(answer); } }
配列の回の 1 つめの例題「与えられた数の合計を求める」を改造して、 コマンドラインから入力された数の合計を求めるプログラムを作成します。
$ java SumAndListFromArgs 3 5 6
というように実行すると計算結果の 14 が表示されるといった具合いです。
1つ前の例題を踏まえ、コマンドライン引数の文字列を一つ一つ取り出し、 Integer.parseInt で数値に変換しながら合計を求めるプログラムは 次のようになります。 ファイル名は SumAndListFromArgs.java としています。
class SumAndListFromArgs { public static void main (String[] args) { int sum = 0; for (int i = 0; i < args.length; i++) sum = sum + Integer.parseInt(args[i]); System.out.println("合計値:" + sum); System.out.println("コマンドライン引数の内容:"); for (i = 0; i < args.length; i++) System.out.print(Integer.parseInt(args[i]) + " "); System.out.println(); } }
以下の例のように、引数に任意の個数の整数を入力し実行すると、 合計値が表示されます。
java SumAndListFromArgs 2 4 6 8 10 合計値: 30 コマンドライン引数の内容: 2 4 6 8 10