7.1 配列型の変数
7.1.1 変数のコレクション
関連する情報量が膨大である場合、個々の変数を宣言していてはあまりにも面倒です。100 や 1000 個の数値情報を扱うのに、100 や 1000 個の変数宣言をすることはあまりにも非効率的な作業です。そこで、こうした大量の変数をまとめて管理するには配列を用います。
配列を用いれば、同じ型の同じ変数名で、複数の記憶領域を確保することができます。イメージとしては、列車のように変数という車両が並んでいる状態を想像すればよいでしょう。車両の数は自由に指定することが可能で、車両番号を用いてアクセスすることが可能なのです。
配列変数を宣言するには、フィールド宣言やローカル変数宣言文で、変数名の後に [ ] を指定します。この [ ] をブラケット(次元指定子)と呼びます。次の変数宣言は配列変数であることを表しています。
int ary[] ;
しかし、配列変数を宣言しただけでは記録領域は確保されません。配列変数は、プリミティブ型ではなく参照型なのです。変数 ary は数値型のリストを保存するための記憶領域を参照しているだけなので、宣言するだけでは null を指しているだけです。配列の実体を生成するには配列生成式(配列インスタンス生成式とも呼ばれる)を用います。配列生成式は new キーワードを用いて次のように記述します。
new 型名[式]
配列生成式は、指定した型名の配列をブラケット内に指定した数値だけ作成します。配列生成式で作られた配列の実体への参照を配列変数に代入することができます。もちろん、代入するには型の互換性が必要です。
int ary[] = new int[5];
例えば、上の文は、数値型の配列を 5 つ作成しています。メモリ概念としては、少なくとも数値型の変数を 5 つ宣言した場合と同じ記憶領域が確保されます。つまり、上記の宣言は 5 つの数値型変数が存在するようなものなのです。配列内に存在する 5 つの変数を構成要素と呼びます。そして、配列の実体の型を構成要素型と呼びます。構成要素型が int である上記の文は、配列要素の値も常に int となります。
配列の構成要素にアクセスしなければ、各要素に代入したり、各要素から値を取得することはできません。構成要素へのアクセスは配列名の後に要素の番号を数値型で指定したブラケット [ ] を指定します。
ary[0] = 10;
構成要素の番号は 0 番から始まることに注意してください。配列生成式で構成要素の数を 5 とした場合、配列は 0 ~ 4 番までの 5 つの構成要素にアクセスすることができます。
class Test { public static void main(String args[]) { int [] ary = new int[3]; ary[0] = 10; ary[1] = 100; ary[2] = 1000; System.out.println("ary[0] = " + ary[0]); System.out.println("ary[1] = " + ary[1]); System.out.println("ary[2] = " + ary[2]); } }
>java Test ary[0] = 10 ary[1] = 100 ary[2] = 1000
コード1では、3 つの構成要素を保有する int 型の配列を生成しています。この参照を ary 変数に代入し、これを用いて各構成要素を初期化します。構成要素にアクセスするには ary[0] というようにブラケット内に目的のインデックスを指定します。各構成要素に値が正しく代入されているのか、実行結果を見れば確認することができます。
7.1.2 main() メソッドのパラメータ
main() メソッドの宣言では、必ず String 型のパラメータ args を宣言していました。この変数の直後にブラケットを指定していたのは、このパラメータが文字列型の配列だったためです。これまでは配列を説明していなかったため、このパラメータの解説を避けてきましたが、これでようやく main() メソッドが受け取るパラメータを調べることができます。
main() メソッドを呼び出すのは Java 仮想マシンを実装するシステムであり、プログラムではありません。では、Java 仮想マシンは main() メソッドに何を渡すのでしょうか。それは、コマンドライン引数(プログラム起動時に指定されたパラメータ文字列)です。Java 仮想マシン(java コマンド)を起動するときに渡された引数は main() メソッドの args パラメータに渡されます。プログラムの利用者はコマンドを通してプログラムに引数を渡すことができるため、コンソールプログラムを開発する場合、この情報は重要になるでしょう。
class Test { public static void main(String args[]) { System.out.println(args[0]); } }
>java Test "Kitty on your lap" Kitty on your lap >java Test "Blue Blue Glass Moon, Under The Crimson Air." Blue Blue Glass Moon, Under The Crimson Air.
コード2は、コマンドライン引数として受け取ったパラメータを画面に表示するというエコープログラムです。実行結果は Windows のコマンドプロンプトからのものであり、Java に引数を渡す方法は実装に依存する問題です。
しかし、このプログラムには大きな欠点が存在します。引数を渡さずに起動した場合は null を参照してしまうため例外が発生してしまいますし、複数の引数を渡した場合も、最初の引数しか表示することができません。与えられた引数に柔軟に対応するには、配列の構成要素数を調べなければなりません。この方法は「7.4 配列のメンバ」で説明します。