配列の書き方がいろいろあって、混乱したので自分用にまとめました。
この記事の対象読者
以下のコードが構文エラーになる理由がわからない人
int[] ary;
ary = new int[]
ary[0] = 1;
ary[1] = 2;
ary[2] = 3;
このエラーの理由がわからない場合は、この記事を読めば頭が整理されてスッキリすると思います。
結論
配列を定義して使用するためには、以下の3つのステップが必要になります。
- 配列の宣言
- 配列の生成
- 要素の初期化
3番目の「要素の初期化」はなくてもエラーにはならないけど、
わかりやすいコードにするためにも、明記することが推奨されてます。
配列の宣言
まず最初に必要なのは、配列の宣言です。
こんなやつ。
int[] ary;
int ary[];
aryという変数名で配列を宣言してます。
上記はどちらも同じ意味です。
お好みでどうぞ。
また、intのところをStringやdouble等、他の型にすることもできます。
intで宣言したら、int型の要素しか入れることができません。
配列の生成
次に必要なのは、配列の生成です。
newを使うあれです。
new int[要素数];
この記述により、配列に使用するメモリが確保されます。
実際の書き方
int[] ary; // 配列の宣言
ary = new int[要素数]; // 配列の生成
1行で書くこともできます。
int[] ary = new int[要素数]; // 配列の宣言 + 配列の生成
エラーになるケース
- 要素数の省略
- 配列の宣言をしない
場合、構文エラーになります。
// 要素数の省略
int[] ary;
ary = new int[]; // 構文エラー
// 配列の宣言をしない
ary = new int[要素数]; // 構文エラー
要素の初期化
配列の生成をしただけでは、中身は空っぽです。
※正確には型に応じた規定値(intの場合は0)が入ってます。
配列として扱うために、配列に要素を入れてあげる必要があります。
まとめて初期化
int[] ary;
ary = new int[3] {1, 2, 3};
ひとつずつ初期化
int[] ary;
ary = new int[3];
ary[0] = 1;
ary[1] = 2;
ary[2] = 3;
1行で書く場合
配列の宣言から初期化まで1行で書くこともできます。
int[] ary = new int[3] {1, 2, 3};
どれも使っても同じ結果になります。
やりがちな間違い
int[] ary; // 配列の宣言
ary = new int[3]; // 配列の生成
ary = {1, 2, 3}; // 配列の初期化
配列の宣言もされていて、要素数も指定されているし、問題がないように見えます。
ですが、これはエラーになります。
問題なのは3行目。
これで初期化ができているように見えますが、実は初期化できていません。
なぜなら、ary
に入っているのは配列への参照情報だからです。
{}
を使ってまとめて初期化したい場合は、new int[]
と一緒に記述する必要があります。
ここまでが配列の書き方の基本です。
冒頭のコードはなぜエラー?
では、冒頭のコードはなぜエラーになるのでしょうか?
このコードです。
int[] ary;
ary = new int[];
ary[0] = 1;
ary[1] = 2;
ary[2] = 3;
ここまで読んでいただいたらわかると思います。
そうですね。要素数が指定されていません。
正しくはこう。
int[] ary;
ary = new int[3]; // 要素数を指定
ary[0] = 1;
ary[1] = 2;
ary[2] = 3;
これで正常に動作します。
おまけ:省略記法
配列を扱うには上記の3ステップが必要なのですが、
Javaには省略記法というものが用意されています。
要素数の省略
// 1行で書く場合
int[] ary1 = new int[] {1, 2, 3};
// 分けて書く場合
int[] ary2;
ary2 = new int[] {1, 2, 3};
{}
を使用して同時に初期化する場合に限り、要素数を省略することができます。
配列の生成の省略
int[] ary = {1, 2, 3};
配列の生成も省略してるし、参照情報を入れるary
に要素を直接代入しており、エラーが出る気がするのですが、こちらも正常に動作します。
これらの記法に限り、省略が許可されています。
ここは理屈ではなく、こういうものだと割り切って暗記すると、混乱しなくて済むと思います。
まとめ
配列の書き方を自分なりにまとめてみました。
自分はこの考え方で、結構あたまの中がスッキリしたので、
少しでも理解の助けになればうれしいです。