コマンドライン引数って何?
いつも書いているmainメソッドの「String[] args」には、どんな意味があるのでしょうか。プログラムを実行するときに文字列を渡し、mainメソッドで受け取る方法を見てみましょう。
mainメソッドに渡す引数
メソッドについての理解が深まったところで、意味も分からず覚えたmainメソッドについてもう一度よく見てみましょう。次は、CommandLineクラスに書くmainメソッドの部分です。
CommandLine.java
public static void main(String[] args) {
}初めは意味不明なアルファベットの羅列だったと思いますが、ちょっと意味が分かるようになっていませんか?
publicとstaticはここでは横へ置いておくとして、voidは「戻り値を返しません」という意味でした。
そして、後ろの( )の中にはString[] argsが入っていますね。これは、このメソッドがStringの配列を引数として受け取るという意味です。argsは、その配列を受け取る仮引数の名前です。ただの変数名なので、args以外の名前でも構いません。
普通のメソッドなら、呼び出すときに( )の中に引数を書きます。しかし、プログラムの起動時には、自分でmainメソッドの呼び出しを書くわけではありません。実行を開始すると、Javaの実行環境がmainメソッドを呼び出します。
では、そのmainメソッドに文字列を渡すには、一体どうすればよいのでしょうか。
コマンドライン引数
プログラムを実行するとき、コマンドに続けて指定する値を、コマンドライン引数と言います。今回の書き方では、それらの値がStringの配列にまとめられてmainメソッドに渡されます。
Windowsのコマンドプロンプトや、macOSのターミナルで、javacやjavaなどのコマンドを入力するところをコマンドラインと言います。そこから引数を渡すので、コマンドライン引数というわけです。
具体的な渡し方を見る前に、受け取った配列の要素を一つずつコンソールに表示するだけのクラスを作りましょう。ファイル名はCommandLine.javaです。
CommandLine.java
public class CommandLine {
public static void main(String[] args) {
for (int i = 0; i < args.length; i++) {
System.out.println(args[i]);
}
}
}for文を使って、受け取った配列の要素を全部順番に表示します。args.lengthは要素の数、args[i]はi番目の要素です。for文が分かりにくい人は、for文って何?を確認してください。
コンパイルして、引数を付けて実行する
では、実際に引数を渡して実行してみましょう。CommandLine.javaを保存したフォルダに移動し、まずコンパイルします。これは普通のコンパイルと同じです。
javac -encoding UTF-8 CommandLine.javaソースファイルはUTF-8で保存してください。コマンドの入力やフォルダの移動が分からない場合、またはjavacやjavaが見つからない場合は、コンパイルと実行の記事を参照してください。
次に実行です。クラス名の後ろにスペースを空けて、渡したい文字列を入力します。さらにスペースを挟めば、複数の文字列を渡せます。今回はHello、Java、123の三つを渡してみましょう。
java CommandLine Hello Java 123クラス名には.classを付けません。このコマンドを入力してEnterを押すと、次のように表示されます。
Hello
Java
123渡した文字列が、順番に全部表示されました。ちゃんとmainメソッドに渡せていますね。
| mainメソッド内での参照 | 値 |
|---|---|
args[0] | "Hello" |
args[1] | "Java" |
args[2] | "123" |
args.length | 3 |
クラス名のCommandLineは、argsの要素には入りません。また、123のように数字を書いても、受け取るのはintの123ではなく、Stringの"123"です。
for文を使っているので、渡された配列の要素の数だけ表示されます。文字列を変えたり、数を増やしたりして試してみてください。
コマンドライン引数を付けなかったら?
mainメソッドはStringの配列を受け取るように定義されていますが、コマンドライン引数を付けずに実行することもできます。
java CommandLineこの場合もmainメソッドには配列が渡されます。ただし、要素数が0の空のString配列です。argsがnullになるわけでも、mainメソッドの引数が省略されるわけでもありません。
args.lengthが0なので、今回のfor文は一度も繰り返されず、何も表示せずに終了します。
つまり、コマンドラインで指定する文字列が0個でも3個でも、mainメソッドが受け取る引数は一つのString配列です。変わるのは、その配列の要素数です。
普通のメソッドと同じように、定義に合った引数が渡されています。異なる引数の組み合わせを受け付けるメソッドの書き方については、メソッドのオーバーロードで説明します。
まとめ
質問・コメント
読み込み中この記事についての質問や、学習して気づいたことをお寄せください。
この記事のコメント
旧サイトに寄せられたコメントも当時の投稿内容のまま掲載しています。現在の記事では変更している内容や、旧環境についてのやり取りも含まれます。
コメントを読み込んでいます。