配列

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[]である。これはコマンドラインから実行するときに指定することができる。つまり、プログラムの実行時に(コンパイル時ではなく)値を渡すことができる!!

その他のトピックス

他にも、初期化や多次元配列に関して知っておいた方がいいことがあるが、本講義では取り扱わない。実用の観点からは配列よりもコレクションフレームワークを使うことの方が多く、その説明に時間を使いたいからである。ただし、処理二よっては配列を使った方が都合が良い場合もあるので、ぜひ調べてみて欲しい。