配列の基本
9.1 配列の基本
複数の同じ型の変数を1つにまとめたものを、配列といいます。プログラムでたくさんの変数を扱うと、ソースコードが複雑で読みにくくなってしまうことがありますが、そのようなときに配列を使うと便利です。
9.1.1 配列の概念
あるマンションの10部屋の住人の居住年数を管理することとします。
今まで学習した内容だけで考えると、おそらくint型の変数を10個宣言することになるでしょう。
図 9.1.1 : 人数分の変数を宣言
これをソースコードにすると下のようになり、変数の宣言だけで10行もかかってしまいます。
int a; int b; int c; int d; int e; int f; int g; int h; int i; int j;
しかし、10個の変数を一度に管理することができれば、変数の宣言は1回だけで済みます。このような場合に使うのが配列です。
配列の構文は次の節で詳しく説明しますが、配列を使うことで、この場合の記述が1行で済むのです。
変数kandaMansionの配列のイメージは、図 9.1.2のようになります。
図 9.1.2 : 配列のイメージ
kandaMansion全体が配列ですが、そのなかの個々の入れ物のことを要素といいます。 上の図で各要素の前面に書かれている「kandaMansion [ ]」の「[ ]」の中の番号(例えば「kandaMansion [0]」の「0」)は、配列の中の各要素の番地を表し、インデックスまたは添え字と呼びます。
9.1.2 配列の宣言と領域の確保
配列の名前の付け方は、通常の変数と同じです。但し、宣言の仕方が少し異なります
変数の宣言とよく似た書式ですが、型名の後に「[ ]」が付いていることに注意して下さい。これが配列の印です。
図 9.1.3 : 配列宣言
配列の宣言は、配列を管理する変数を作るだけです。配列の宣言をした後にはデータを記憶する領域を確保する必要があります。ここで言う「データを記憶する領域」とは、配列の実体(実際の値)が入る領域(場所)を意味します。具体的には、パソコンのメモリの中にデータを記憶する場所を確保することです。
配列の記憶領域の確保は次のような書式になります。
new演算子は、配列などのオブジェクトと呼ばれるものを新しく作成する場合に使用する演算子です。
new演算子により、配列の実体の領域が確保されます。
要素数は文字通り要素の数です。例では、int型のデータ3個分(要素数が3)の記憶領域を確保しています。
図 9.1.4 : 配列の場所情報(記憶領域確保)のイメージ
これで、配列変数kandaMansionが、実際に値が入っている場所を参照するようになります。当テキストでは、「参照する」という意味を矢印(→)で表します。配列変数kandaMansionに代入されている値は、配列の実体である要素(ここではkandaMansion[0])がメモリ上に記憶されている場所情報です。
もし配列をマンションに例えるなら、3つの要素は、そのマンションにある3つの部屋です。最初の部屋番号は「0号室」、次の部屋番号は「1号室」、最後の部屋番号は「2号室」となります。
配列の要素のインデックス(ここでは、部屋番号に例えて説明しています)は、「1」ではなく必ず「0」から始まるということを覚えておいてください。
また、一度記憶領域を確保すると、後から配列の長さ(要素数、つまりここでは部屋数)を変更することはできませんので、注意が必要です。配列の長さを変えたい場合は、その長さで新しく要素の記憶領域を確保することが必要です。例えば、「kandaMansion = new int[3]」と記述し要素の長さが3の記憶領域が確保されているものから、要素の長さを5に変更するとします。その場合は、「kandaMansion = new int[5]」と再度new演算子を使って要素の記憶領域を確保しなければなりません。
new演算子を使って配列の要素の記憶領域を確保する時、各要素の値が自動的に規定値(デフォルト値)で初期化されます。int型の配列の要素の規定値は0なので、要素の記憶領域を確保したと同時に、要素の値は0になります。
図 9.1.4 : 配列の場所情報(記憶領域確保)のイメージ
int型の配列の要素の規定値は0ですが、型によって規定値は異なります。以下がその一覧です。
表 9.1.1 : 配列の規定値
また、宣言と領域確保を同時に記述することもできます。
図 9.1.6 : 配列の宣言と記憶領域確保
下の書式は、どちらも結果は同じになります。
ポイント
- 配列は、同じ型の値を複数まとめて扱うことができる。
- 配列の記憶領域を確保するには、new演算子を用いて、記憶するデータの型と要素数を指定する。
- new演算子を用いて配列の記憶領域を確保すると、規定値が設定される。
- 配列の大きさ(要素数)は、一度記憶領域を確保すると変更できない。
- 配列のインデックスは「0」から始まる。
9.1.3 配列の作成、及び規定値を確認するプログラム
それでは、配列を作成(宣言と記憶領域の確保)し、配列の中に格納されている値を確認するプログラムを作っていきましょう。
① ソース・フォルダー :myproj_intro/src
② パッケージ :jp.co.f1.intro.ch9
③ 名前 :CreateArray
④ 作成するメソッド・スタブの選択:public static void main(String[] args) にチェックを入れる
➢ CreateArray.java
package jp.co.f1.intro.ch9; public class CreateArray { public static void main(String[] args) { // 配列変数の宣言と要素の作成 int[] kandaMansion; kandaMansion = new int[3]; System.out.println("kandaMansionの値 : " + kandaMansion); System.out.println("0号室の値 : " + kandaMansion[0]); System.out.println("1号室の値 : " + kandaMansion[1]); System.out.println("2号室の値 : " + kandaMansion[2]); } }
実行結果
解説
8行目で、int型の配列を宣言します。これは配列を管理する変数の宣言をしているだけで、まだ値は入っていません。9行目でnew演算子を使い、配列の3つの要素を作成します。int型配列のデフォルト値0 が各要素に入っています。
図 9.1.7 : 配列の宣言と記憶領域確保
11行目では、int型の配列変数kandaMansionの値をコンソールウィンドウにそのまま出力していますが、実行結果には、何やら英数字と記号の羅列のようなものが出力されてしまいました。
図 9.1.8 : 配列の参照の表示
配列変数kandaMansionには、配列の実体の「場所情報」が入っていますが、今回表示された文字列は、その場所情報が暗号化されたものです。なお、ここでは「[I@ca0b6」という表示値になりましたが、これは実行結果毎に異なる場合があります。
Javaでは、ユーザーが直接場所情報に触れることを禁止していますので、今回のような暗号化された文字列が出力されてしまうのです。
このように、配列変数をそのまま指定しても配列に代入されている値を扱うことはできません。13~15行目までのようなインデックスの指定が必要です。
13~15行目では、要素に代入されている値を表示しています。
図 9.1.9 : 配列の0番目の要素に入っている値を参照(表示)する例
配列宣言の記述方法配列の宣言は、以下のように書くこともできます。
型名 配列変数名[ ] ;
「[ ]」を配列名の後ろに付けても文法上問題はありませんが、Javaでは型名の後ろに付けることが推奨されています。「△△型の配列で、その変数名は○○である」と認識するためです。