C言語の配列
C言語では、データをまとめて扱う方法(の1つ)として、「配列」があった。例えば、int型の変数を5つ扱う場合には、
と宣言することによって、a[0]、a[1]、a[2]、a[3]、a[4]という5つの変数が使える。
Java言語の配列
Java言語でも配列が使えるが、C言語とは違うところがある。
宣言とインスタンス化
Java言語では、「int型の配列」は「「int型の配列」という型」があると考えた方が良い。だからというわけでもないが、C言語のように変数名の後ろにかっこがくるのではなく、「int[]」を型として扱うように書く。そして「インスタンス化」が必要。インスタンス化はnew演算子を用いる。
注意して欲しいのは、プリミティブ型の配列の場合、インスタンス化時に各要素は勝手に初期化されてしまう、ということ。例えば、
は、bが初期化(値の代入)がされていないのでエラーだが、
はエラーにならない。aの各要素は0で初期化されている。もちろん、
はaの宣言だけでインスタンス化がされていないので、何もできない。次のように宣言とインスタンス化を分けるのはOK。
要素へのアクセス
C言語と同様に添え字でアクセスできる。
添え字に変数を使うこともできるので、for文を使ってアクセスすることもできる。例えば、全ての値を表示するには次のようにする。
ここで、a.lengthに注目しよう。これは「配列aの要素数」を表している。
実は、配列というのは、クラスのインスタンスのようなもので、lengthというフィールドを持っているように扱える(ただし読み出し専用)。配列の要素も、「添え字でアクセスできる特殊なフィールド」と考えて良い。
つまり、
のイメージはこんな感じ。
クラス型(参照型)の配列
参照型の配列も同様だが、各要素はそれぞれインスタンス化する必要がある。
例えば、lesson05で作成したBookクラスの配列を作ってみよう。
これは、18行目でエラーになる。bookArrayの要素bookArray[0]がインスタンス化されていない(つまりbookArray[0]という入れ物が空っぽ)だからだ。これが有名な「ヌルポ」である。
だから、各要素をインスタンス化(あるいはインスタンスを代入)してやらなければならない。17〜19行目を削除して、次を追加しよう。
これで、先ほどのループも実行できる(28〜30行目を追加)。
もちろん(条件が合えば)for文を使って各要素のインスタンス化をしても良い。
mainメソッドの引数
mainメソッドの引数はString[]である。これはコマンドラインから実行するときに指定することができる。つまり、プログラムの実行時に(コンパイル時ではなく)値を渡すことができる!!
その他のトピックス
他にも、初期化や多次元配列に関して知っておいた方がいいことがあるが、本講義では取り扱わない。実用の観点からは配列よりもコレクションフレームワークを使うことの方が多く、その説明に時間を使いたいからである。ただし、処理二よっては配列を使った方が都合が良い場合もあるので、ぜひ調べてみて欲しい。