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