C言語の配列
C言語では、データをまとめて扱う方法(の1つ)として、「配列」があった。例えば、int型の変数を5つ扱う場合には、
1 |
int a[5]; |
と宣言することによって、a[0]、a[1]、a[2]、a[3]、a[4]という5つの変数が使える。
プリミティブ型の配列
- Main1.java: プリミティブ型の配列の利用例
宣言とインスタンス化
1 |
int[] a = new int[5]; |
Java言語では、「int型の配列」は「「int型の配列」という型」があると考えた方が良い。だからというわけでもないが、C言語のように変数名の後ろにかっこがくるのではなく、「int[]」を型として扱うように書く。そして「インスタンス化」が必要。インスタンス化はnew演算子を用いる。
注意して欲しいのは、プリミティブ型の配列の場合、インスタンス化時に各要素は勝手に初期化されてしまう、ということ。例えば、
1 2 |
int i; System.out.println(i); |
は、bが初期化(値の代入)がされていないのでエラーだが、
1 2 |
int[] a = new int[5]; System.out.println(a[0]); |
はエラーにならない。aの各要素は0で初期化されている。もちろん、
1 |
int[] a; |
はaの宣言だけでインスタンス化がされていないので、何もできない。次のように宣言とインスタンス化を分けるのはOK。
1 2 |
int[] a; a = new int[5]; |
要素へのアクセス
C言語と同様に添え字でアクセスできる。
1 2 3 4 5 |
a[0] = 1; a[1] = 10; a[2] = 1000; a[3] = 10000; a[4] = 100000; |
添え字に変数を使うこともできるので、for文を使ってアクセスすることもできる。
1 2 3 4 |
for (int i = 0; i < 5; i++) { System.out.print(a[i] + " "); } System.out.println(); |
また要素数を直接書かずに、次のように書くこともできる。
1 2 3 4 |
for (int i = 0; i < a.length; i++) { System.out.print(a[i] + " "); } System.out.println(); |
ここで、a.lengthに注目しよう。これは「配列aの要素数」を表している。
実は、配列というのは、クラスのインスタンスのようなもので、lengthというフィールドを持っているように扱える(ただし読み出し専用)。配列の要素も、「添え字でアクセスできる特殊なフィールド」と考えて良い。
つまり、
1 |
int[] a = new int[5]; |
のイメージはこんな感じ。
宣言と同時に初期化
要素数の指定は必要ない。
1 |
int[] b = {2, 20, 200, 2000}; |
クラス型(参照型)の配列
- Main2.java: クラス型(参照型)の配列の利用例
参照型の配列も同様だが、各要素はそれぞれインスタンス化する必要がある。例えば、lesson07で作成したRectangleクラスの配列を作ってみよう。別のパッケージのクラスを使うためのimport文については教科書P.167を参照。
1 |
Rectangle[] a = new Rectangle[3]; |
この状態では、各要素はインスタンス化されていないことに注意(プリミティブ型の配列の場合は、配列のインスタンス化のタイミングで要素が初期化されていた)。
だから、配列をインスタンス化しただけでは、次のコードはエラーになる。
1 |
System.out.println("a[0]の面積は" + a[0].getArea()); |
aの0番目の要素a[0]がインスタンス化されていない(つまりa[0]という入れ物が空っぽ)だからだ(これが所謂「ぬるぽ」)。
だから、各要素をインスタンス化(あるいはインスタンスを代入)してやらなければならない。
1 2 3 |
a[0] = new Rectangle(1, 2); a[1] = new Rectangle(3, 4); a[2] = new Rectangle(4, 5); |
forの利用や初期化等はプリミティブ型の場合と同様。
その他のトピックス
- mainメソッドの引数はString[]である。これはコマンドラインから実行するときに指定することができる。つまり、プログラムの実行時に(コンパイル時ではなく)値を渡すことができる!!
- 他にも、多次元配列に関して等、知っておいた方がいいことがあるが、本講義では取り扱わない。実用の観点からは配列よりもコレクションフレームワークを使うことの方が多い(来年度のJava IIで扱う)。ただし、処理二よっては配列を使った方が都合が良い場合もあるので、ぜひ調べてみて欲しい。