Java超|配列の宣言と初期化

配列は、まとめて準備できるともっと読みやすくなる。
宣言・確保・初期化の違いをつかめば、Javaのデータ準備は「空の訓練棚」から「中身入りの記録パネル」まで自在に扱える。

これまで、配列を使うときは、次の流れで考えてきました。

流れ内容
1配列変数を宣言する
2要素を確保する
3各要素に値を代入する

この流れは、配列の仕組みを理解するうえでとても大切です。

たとえば、整数を5個入れられる配列を用意する場合、次のように書けます。

int[] data;
data = new int[5];

この書き方では、まず data という配列変数を用意し、そのあとで整数を5個入れられる要素を確保しています。

ただし、Javaでは、いつも宣言と確保を別々に書く必要はありません。

宣言と要素の確保を1つの文にまとめたり、最初から値が決まっている場合には、宣言・要素の確保・値の代入までまとめて書いたりできます。

ドラゴンボール風にたとえると、これまでは「訓練記録パネルに名前札を付ける」「記録枠を5個作る」「それぞれの枠に修行記録を入れる」という作業を順番に行っていました。

でも、慣れてくると、もっと手際よく準備できます。

名前札付きの記録パネルを一気に作る。
あるいは、記録パネルを作ると同時に、最初から修行記録札まで入れておく。

このような書き方を覚えると、配列のコードがよりすっきり読みやすくなります。

この記事では、配列の宣言と要素の確保を1行にまとめる書き方、そして配列をまとめて初期化する書き方について、Sample3.java と Sample4.java を使って整理していきます。

これまでの配列の準備を振り返る

配列を準備するとき、基本としては次のように考えます。

int[] data;
data = new int[5];

この書き方では、2つの作業を分けています。

行っていること
int[] data;整数の配列を扱う変数 data を用意する
data = new int[5];整数を5個入れられる配列を作る

つまり、最初の文で配列変数を宣言し、次の文で要素を確保しています。

ドラゴンボール風にたとえると、まず data という名前札を作ります。
そのあとで、5つの記録枠を持つ訓練パネルを作り、その名前札と結びつけるイメージです。

この書き方は、配列の仕組みを分けて理解しやすいです。

作業ドラゴンボール風のイメージ
配列変数の宣言訓練記録パネルの名前札を作る
要素の確保記録を入れる枠を作る
値の代入枠に修行記録札を入れる

ただ、宣言した直後にすぐ要素を確保するなら、1つの文にまとめたほうが自然なことも多いです。

宣言と要素の確保は1つにまとめられる

Javaでは、配列変数の宣言と要素の確保を1つの文にまとめて書けます。

int[] data = new int[5];

この1行は、次の2行をまとめたものです。

int[] data;
data = new int[5];

意味は同じです。

どちらも、整数を5個入れられる配列を data という名前で扱えるようにしています。

書き方内容
int[] data; data = new int[5];宣言と確保を分けて書く
int[] data = new int[5];宣言と確保を1行で書く

1行で書くことで、配列を使う準備がまとまって見えるようになります。

ドラゴンボール風にたとえると、分けて書く方法は「名前札を作ってから訓練パネルを作る」流れです。

1行にまとめる方法は「名前札付きの訓練パネルを最初から作る」流れです。

どちらも完成するものは同じです。
ただ、書き方が少しすっきりします。

1行で書いた配列の意味を分解する

次の書き方を、部分ごとに見ていきましょう。

int[] data = new int[5];
部分意味
int[]整数を複数まとめて扱う配列型
data配列変数の名前
=作った配列を data に結びつける
new新しく配列を作る
int[5]整数を5個入れられる配列

この1行では、次の2つが同時に行われています。

作業内容
宣言data という配列変数を用意する
要素の確保整数を5個入れられる配列を作る

ただし、この段階では、まだ自分で決めた値を入れているわけではありません。

5個の箱は用意されています。
でも、そこに具体的な修行記録はまだ入っていません。

ドラゴンボール風にたとえると、5個の記録枠を持つ訓練パネルは完成しています。
しかし、その枠の中に、12ページ、18ページ、25ページのような修行書の読書記録はまだ入っていない状態です。

つまり、int[] data = new int[5]; は、配列を使うための準備までは済んでいますが、実際の値はあとから代入する必要があります。

図:宣言と要素の確保を1行で行う

この図が示していること

この図では、int[] pages = new int[5]; という1つの文で、配列変数の宣言と5個分の要素の確保が同時に行われることを示しています。

pages という配列変数が用意され、その先に 0 から 4 までの添字を持つ5つの箱が作られています。

ただし、箱の中にはまだ具体的な値が入っていません。

ここから分かることは、この書き方では配列の準備はできても、具体的に扱いたい値は別途代入する必要があるということです。

宣言と要素の確保を1行にまとめる

ここでは、5日分の修行書の読書ページ数を配列に入れて、順番に表示するプログラムを見ていきます。

ファイル名:Sample3.java

class Sample3
{
    public static void main(String[] args)
    {
        int[] pages = new int[5];   // 1つの文で配列を準備する

        pages[0] = 12;
        pages[1] = 18;
        pages[2] = 25;
        pages[3] = 10;
        pages[4] = 30;   // 各要素に読んだページ数を代入する

        for(int i = 0; i < 5; i++){
            System.out.println((i + 1) + "日目に読んだ修行書のページ数は " +
                               pages[i] + "ページです。");
        }
    }
}

実行結果は次のようになります。

1日目に読んだ修行書のページ数は 12ページです。
2日目に読んだ修行書のページ数は 18ページです。
3日目に読んだ修行書のページ数は 25ページです。
4日目に読んだ修行書のページ数は 10ページです。
5日目に読んだ修行書のページ数は 30ページです。

このプログラムでは、次の1行で配列を準備しています。

int[] pages = new int[5];

この1行によって、pages という配列変数を用意し、整数を5個入れられる配列を作っています。

そのあと、各要素に値を代入しています。

添字代入される値
012
118
225
310
430

そして、for文で pages[0] から pages[4] までを順番に表示しています。

for(int i = 0; i < 5; i++){
    System.out.println((i + 1) + "日目に読んだ修行書のページ数は " +
                       pages[i] + "ページです。");
}

ドラゴンボール風にたとえると、pages は「修行書の読書記録パネル」です。

0番の枠には12ページ。
1番の枠には18ページ。
2番の枠には25ページ。

その記録を、for文で0番から順番に読み上げている流れです。

1行で準備しても、値の代入はまだ別

Sample3.java のポイントは、宣言と要素の確保は1行でまとまっているけれど、値の代入はまだ1つずつ行っていることです。

int[] pages = new int[5];

この時点では、5個の要素を持つ配列が作られています。

そのあとで、次のように値を入れています。

pages[0] = 12;
pages[1] = 18;
pages[2] = 25;
pages[3] = 10;
pages[4] = 30;

つまり、Sample3.java の流れは次のようになります。

順番内容
1pages という配列変数を用意する
25個分の要素を確保する
3各要素にページ数を代入する
4for文で順番に表示する

ドラゴンボール風にたとえると、最初に5個の記録枠を持つ訓練パネルを作ります。

そのあと、0番から4番までの枠に、読んだページ数の札を1枚ずつ入れていきます。

ここで大切なのは、int[] pages = new int[5]; は「中身入りの配列を作る文」ではないということです。

5個の箱を作るところまでです。
自分で決めた値は、あとから pages[0]、pages[1] のように添字を指定して代入します。

配列の初期化とは何か

宣言と要素の確保を1行にまとめるだけでも、コードは少しすっきりします。

ただ、最初から配列に入れたい値が決まっている場合は、さらに短く書けます。

それが、配列の初期化です。

配列の初期化では、宣言、要素の確保、値の代入をまとめて行います。

int[] pages = {12, 18, 25, 10, 30};

この1行だけで、次の3つが行われます。

行われること内容
宣言pages という配列変数を用意する
要素の確保値の個数に合わせて配列を作る
値の代入並べた値を順番に要素へ入れる

この書き方では、new int[5] のように要素数を書いていません。

それでも、波かっこ { } の中に値が5個あるため、Javaが5個分の配列を作ると判断します。

ドラゴンボール風にたとえると、これは「訓練記録パネルを作ると同時に、最初から修行記録札も枠に入れておく」方法です。

あとから1枚ずつ入れるよりも、準備が一気に整います。

配列の初期化では要素数を自動で判断してくれる

配列の初期化では、値がいくつ並んでいるかによって、要素数が決まります。

たとえば、次のように5個の値が並んでいれば、5個の要素を持つ配列になります。

int[] water = {900, 1200, 1100, 1000, 1300};
並んでいる値個数
900, 1200, 1100, 1000, 13005個

この場合、使える添字は 0 から 4 までです。

添字
0900
11200
21100
31000
41300

要素数を自分で書かなくても、Javaが値の数から判断してくれます。

ただし、添字が0から始まることは変わりません。

5個の値があるなら、最後の添字は 4 です。

ドラゴンボール風にたとえると、5枚の水分補給記録札を並べて訓練パネルを作った場合、記録枠は5つです。
番号札は0番から始まるので、最後は4番になります。

図:配列の初期化は準備と代入を一度に行う

この図が示していること

この図では、int[] water = {900, 1200, 1100, 1000, 1300}; という1つの文で、配列変数の宣言、要素の確保、値の代入がまとめて行われることを示しています。

water という配列が用意され、5個の値が順番に要素へ入っています。

900 は water[0]、1200 は water[1]、1100 は water[2] に入る、というように、左から順番に対応します。

ここから分かることは、配列の初期化は「空の箱を作ってあとから値を入れる方法」ではなく、「箱を作ると同時に中身も入れておく方法」だということです。

配列をまとめて初期化する

今度は、配列の初期化を使って、5日分の水分補給量を表示するプログラムを見ていきます。

ファイル名:Sample4.java

class Sample4
{
    public static void main(String[] args)
    {
        int[] water = {900, 1200, 1100, 1000, 1300};   // 配列をまとめて初期化する

        for(int i = 0; i < 5; i++){
            System.out.println((i + 1) + "日目の水分補給量は " +
                               water[i] + "mLです。");
        }
    }
}

実行結果は次のようになります。

1日目の水分補給量は 900mLです。
2日目の水分補給量は 1200mLです。
3日目の水分補給量は 1100mLです。
4日目の水分補給量は 1000mLです。
5日目の水分補給量は 1300mLです。

このプログラムでは、次の1行で配列の準備と値の代入が終わっています。

int[] water = {900, 1200, 1100, 1000, 1300};

この1行によって、water という配列変数が用意され、5個分の要素が確保され、さらに各要素へ値が順番に入ります。

添字
0900
11200
21100
31000
41300

ドラゴンボール風にたとえると、5日分の水分補給記録が、最初から訓練記録パネルにきれいに並んでいる状態です。

パネルを作ってから1つずつ札を入れるのではなく、最初から中身入りの記録パネルを用意しています。

初期化を使うとコードが読みやすくなる

配列の初期化が便利なのは、ただ短く書けるからだけではありません。

どんな値が入っているのかを、一目で確認しやすいことも大きな利点です。

int[] water = {900, 1200, 1100, 1000, 1300};

この書き方なら、water 配列に入っている値がすぐに見えます。

一方、1つずつ代入する書き方では、次のように複数行になります。

int[] water = new int[5];
water[0] = 900;
water[1] = 1200;
water[2] = 1100;
water[3] = 1000;
water[4] = 1300;

どちらも、最終的には同じように5つの値を扱えます。

ただし、最初から値が決まっているなら、初期化のほうがまとまりがよく、読みやすくなります。

書き方読みやすさ
1つずつ代入処理の流れは分かりやすいが、行数が増える
初期化値の一覧がまとまって見える

ドラゴンボール風にたとえると、1つずつ代入する書き方は、空の記録パネルに1枚ずつ札を入れていく方法です。

初期化は、最初から記録札が並んだ完成済みのパネルを用意する方法です。

値の一覧が決まっているなら、初期化のほうが見通しよく書けます。

初期化しても添字の考え方は変わらない

配列を初期化すると、値が一気に入るため、特別な仕組みに見えるかもしれません。

でも、添字の考え方は変わりません。

int[] water = {900, 1200, 1100, 1000, 1300};

この場合も、要素は次のように並んでいます。

添字
0900
11200
21100
31000
41300

最初の値 900 は water[0] です。
2番目の値 1200 は water[1] です。
最後の値 1300 は water[4] です。

Javaの配列では、初期化で書いても、new で作っても、最初の添字は 0 です。

ここは変わらない大切なルールです。

ドラゴンボール風にたとえると、最初から中身入りの訓練記録パネルを作っても、番号札は0番から始まります。

0番に900。
1番に1200。
2番に1100。

この番号の考え方は、どの書き方でも同じです。

ループと組み合わせると初期化した配列も扱いやすい

Sample4.java では、初期化した配列 water を for文で順番に表示しています。

for(int i = 0; i < 5; i++){
    System.out.println((i + 1) + "日目の水分補給量は " +
                       water[i] + "mLです。");
}

i は 0、1、2、3、4 と変化します。

そのため、water[i] は次のように順番に変わります。

i の値water[i]表示される日数
0water[0]1日目
1water[1]2日目
2water[2]3日目
3water[3]4日目
4water[4]5日目

初期化で値を入れた配列でも、ループで処理する考え方は同じです。

配列に値が並んでいるので、添字を順番に変えながら取り出していきます。

ドラゴンボール風にたとえると、最初から水分補給記録が入っている訓練パネルを、0番から4番まで順番に確認して読み上げる流れです。

配列の書き方を比べてみよう

配列の準備には、いくつかの書き方があります。

宣言と要素の確保を分けて書く

int[] water;
water = new int[5];

これは、配列変数の宣言と要素の確保を分けて書く方法です。

配列の仕組みを学ぶときには、とても理解しやすい書き方です。

宣言と要素の確保を1行で書く

int[] water = new int[5];

これは、配列変数を用意し、5個分の要素を確保するところまでを1行で書く方法です。

ただし、値の代入はまだ別に行います。

宣言・要素の確保・値の代入をまとめて書く

int[] water = {900, 1200, 1100, 1000, 1300};

これは、配列の初期化です。

宣言、要素の確保、値の代入をまとめて行います。

書き方宣言要素の確保値の代入
int[] water; / water = new int[5];×
int[] water = new int[5];×
int[] water = {900, 1200, 1100, 1000, 1300};

この表から分かるように、初期化は最もまとめて書ける方法です。

図:配列の書き方の違い

この図が示していること

この図では、配列の3つの書き方の違いを示しています。

左側は、配列変数の宣言と要素の確保を分けて書く方法です。
宣言と確保の違いを確認しやすいですが、値の代入は別に行う必要があります。

中央は、宣言と要素の確保を1行で書く方法です。
配列を使う準備は1行で整いますが、箱の中はまだ空です。

右側は、配列の初期化です。
宣言、要素の確保、値の代入までをまとめて行います。

ここから分かることは、配列の書き方には段階があり、最初から値が決まっているかどうかによって使いやすい形が変わるということです。

初期化が向いている場面

配列の初期化は、最初から入れる値が決まっているときに向いています。

向いている場面理由
固定の記録を使う値をあらかじめ並べて書ける
学習用のサンプルデータの中身がすぐ見える
設定値の一覧開始時点で値が決まっている
曜日や月ごとの固定データデータ数と内容が決まっている

たとえば、5日分の水分補給量がすでに決まっているなら、初期化でまとめて書くと見やすいです。

一方で、あとからキーボード入力で値を入れる場合は、最初に空の配列を作って、ループで1つずつ代入する方法が向いています。

場面向いている書き方
最初から値が決まっている配列の初期化
あとから入力で値を入れるnew で配列を作ってから代入
要素数だけ先に決めたいint[] data = new int[要素数]
値の中身も一緒に見せたいint[] data = {値1, 値2, 値3}

ドラゴンボール風にたとえると、初期化は「すでに決まっている補給量の札を、訓練パネルを作ると同時に並べておく」方法です。

当日その場で戦士が入力する記録なら、先に空のパネルを作ってから、あとで札を入れていくほうが自然です。

配列の書き方は違っても基本の流れは同じ

配列の書き方には、分けて書く方法、1行で確保まで行う方法、初期化でまとめる方法があります。

見た目は違いますが、基本の考え方はつながっています。

基本の流れ初期化での考え方
配列変数を用意するint[] water
要素を確保する値の個数から自動で作られる
値を代入する{ } の中の値が順番に入る

つまり、短く書いているからといって、配列の仕組みが別物になるわけではありません。

宣言、要素の確保、代入という基本の流れを理解しているからこそ、初期化の短い書き方も自然に読めるようになります。

ドラゴンボール風にたとえると、どの書き方でも「訓練記録パネルを用意する」という目的は同じです。

ただし、空のパネルを作るのか。
中身入りのパネルを作るのか。
名前札とパネル作成を分けるのか、まとめるのか。

そこが違います。

配列の初期化で意識したいポイント

配列の初期化を使うときは、次の点を押さえておきましょう。

ポイント内容
最初から値が決まっているときに便利値をまとめて書ける
要素数は値の個数で決まる{ } の中の個数をJavaが見る
添字は0から始まる初期化してもルールは同じ
値は左から順番に入る1つ目が添字0、2つ目が添字1
読みやすさが上がる配列の中身を一覧で確認しやすい

特に大切なのは、初期化では値の数がそのまま要素数になるということです。

int[] water = {900, 1200, 1100, 1000, 1300};

この場合、値が5個なので、要素数も5です。
使える添字は 0 から 4 までです。

値の個数要素数使える添字
3個30, 1, 2
5個50, 1, 2, 3, 4
10個100 から 9

ドラゴンボール風にたとえると、5枚の記録札を並べたなら、記録枠は5つ作られます。
ただし番号札は0番から始まるので、最後は4番です。

場面に合わせて書き方を選ぶ

配列の書き方は1つだけではありません。

大切なのは、場面に合った書き方を選ぶことです。

状況書き方の例向いている理由
配列の仕組みを分けて理解したいint[] data; / data = new int[5];宣言と確保の違いが見えやすい
すぐに配列を使う準備をしたいint[] data = new int[5];1行で準備できて見やすい
最初から値が決まっているint[] data = {10, 20, 30};宣言・確保・代入をまとめられる
あとから入力で値を入れるint[] data = new int[num];必要な数だけ箱を用意できる

ドラゴンボール風にたとえると、棚の仕組みを学ぶときは、名前札と記録枠を別々に確認します。

すぐ記録パネルを使いたいときは、名前札付きのパネルを一気に作ります。

記録の内容まで決まっているときは、中身入りのパネルを最初から用意します。

このように、目的によって書き方を選べるようになると、Javaのコードがぐっと自然に読めるようになります。

配列の宣言と初期化を学ぶ意味

配列の宣言と初期化を理解すると、Javaのコードを読む力がかなり上がります。

実際のプログラムでは、配列を次のように1行で準備する書き方がよく出てきます。

int[] data = new int[5];

また、最初から値を並べる書き方もよく使われます。

int[] data = {10, 20, 30, 40, 50};

このようなコードを見たときに、単に「短い書き方だ」と覚えるだけでは少しもったいないです。

中で何が行われているのかを理解できることが大切です。

見えるコード中で行われていること
int[] data = new int[5];配列変数の宣言と要素の確保
int[] data = {10, 20, 30};宣言、要素の確保、値の代入

この理解があると、配列を使ったプログラムを読むときに迷いにくくなります。

ドラゴンボール風にたとえると、コードを見ただけで「これは空の訓練パネルを作っている」「これは中身入りの記録パネルを作っている」と判断できるようになるイメージです。

配列をまとめて書けるとコードがすっきりする

配列の基本は、宣言、要素の確保、値の代入です。

この流れをしっかり理解したうえで、宣言と確保を1行にまとめる書き方や、初期化で値までまとめる書き方に慣れていくと、コードがとても読みやすくなります。

最初から値が決まっているなら、初期化を使うと配列の中身が一目で分かります。

あとから値を入れるなら、new で必要な数だけ要素を確保しておく書き方が向いています。

目的合う書き方
空の箱だけ先に作りたいint[] data = new int[5];
最初から値まで入れたいint[] data = {10, 20, 30};
入力人数に合わせて箱を作りたいint[] data = new int[num];
学習のために流れを分けたいint[] data; data = new int[5];

ドラゴンボール風にたとえると、配列の書き方は、訓練記録パネルの準備方法を選ぶようなものです。

空のパネルを作るのか。
中身入りのパネルを最初から作るのか。
当日の参加人数に合わせてパネルを作るのか。

その違いを理解しておくと、配列の使い方がぐっとスムーズになります。