配列

C言語の配列

C言語では、データをまとめて扱う方法(の1つ)として、「配列」があった。例えば、int型の変数を5つ扱う場合には、

と宣言することによって、a[0]、a[1]、a[2]、a[3]、a[4]という5つの変数が使える。

プリミティブ型の配列

  • Main1.java: プリミティブ型の配列の利用例

宣言とインスタンス化

Java言語では、「int型の配列」は「「int型の配列」という型」があると考えた方が良い。だからというわけでもないが、C言語のように変数名の後ろにかっこがくるのではなく、「int[]」を型として扱うように書く。そして「インスタンス化」が必要。インスタンス化はnew演算子を用いる。

注意して欲しいのは、プリミティブ型の配列の場合、インスタンス化時に各要素は勝手に初期化されてしまう、ということ。例えば、

は、bが初期化(値の代入)がされていないのでエラーだが、

はエラーにならない。aの各要素は0で初期化されている。もちろん、

はaの宣言だけでインスタンス化がされていないので、何もできない。次のように宣言とインスタンス化を分けるのはOK。

要素へのアクセス

C言語と同様に添え字でアクセスできる。

添え字に変数を使うこともできるので、for文を使ってアクセスすることもできる。

また要素数を直接書かずに、次のように書くこともできる。

ここで、a.lengthに注目しよう。これは「配列aの要素数」を表している。

実は、配列というのは、クラスのインスタンスのようなもので、lengthというフィールドを持っているように扱える(ただし読み出し専用)。配列の要素も、「添え字でアクセスできる特殊なフィールド」と考えて良い。

つまり、

のイメージはこんな感じ。

宣言と同時に初期化

要素数の指定は必要ない。

クラス型(参照型)の配列

  • Main2.java: クラス型(参照型)の配列の利用例

参照型の配列も同様だが、各要素はそれぞれインスタンス化する必要がある。例えば、lesson07で作成したRectangleクラスの配列を作ってみよう。別のパッケージのクラスを使うためのimport文については教科書P.167を参照。

この状態では、各要素はインスタンス化されていないことに注意(プリミティブ型の配列の場合は、配列のインスタンス化のタイミングで要素が初期化されていた)。
だから、配列をインスタンス化しただけでは、次のコードはエラーになる。

aの0番目の要素a[0]がインスタンス化されていない(つまりa[0]という入れ物が空っぽ)だからだ(これが所謂「ぬるぽ」)。

だから、各要素をインスタンス化(あるいはインスタンスを代入)してやらなければならない。

forの利用や初期化等はプリミティブ型の場合と同様。

その他のトピックス

  • mainメソッドの引数はString[]である。これはコマンドラインから実行するときに指定することができる。つまり、プログラムの実行時に(コンパイル時ではなく)値を渡すことができる!!
  • 他にも、多次元配列に関して等、知っておいた方がいいことがあるが、本講義では取り扱わない。実用の観点からは配列よりもコレクションフレームワークを使うことの方が多い(来年度のJava IIで扱う)。ただし、処理二よっては配列を使った方が都合が良い場合もあるので、ぜひ調べてみて欲しい。