Java入門|配列をまとめて初期化する方法

配列はまとめて書くと、もっと見やすく、もっと使いやすくなる

これまでに、配列を使うにはまず宣言をして、そのあとで要素を確保し、さらに必要な値を1つずつ代入していく流れを見てきました。こうした基本の流れはとても大切ですが、Javaではもう少し簡潔に書く方法も用意されています。

特に、最初から入れたい値が決まっている場合は、配列をもっとすっきりした形で表現できます。長いコードを何行も書かなくても、1行で配列の準備を終えられる場面もありますし、宣言・要素の確保・値の代入までをまとめて書けることもあります。

ここでは、配列を簡潔に記述する方法として、配列の宣言と要素の確保を1つにまとめる書き方、そして配列をまとめて初期化する書き方について、やさしくていねいに見ていきます。書き方の違いだけでなく、それぞれがどのような場面で便利なのかも一緒に確認していきましょう。

これまでの配列の準備を振り返ってみよう

まずは、これまで学んできた基本の書き方を思い出してみましょう。
配列を準備するときは、次のように2つの文で書いていました。

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

この書き方では、

  1. 配列変数を宣言する
  2. 5個分の要素を確保する

という2つの作業を分けて行っています。

この方法は、配列の仕組みを理解するうえではとてもわかりやすいです。
ただ、実際のコードでは、この2つをまとめて書きたい場面もよくあります。

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

Javaでは、配列の宣言と要素の確保を1つの文にまとめて書くことができます。

書き方は次のようになります。

int[] data = new int[5];

この1行は、次の2行と同じ意味です。

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

つまり、配列を使うための変数を用意し、その配列に5個分の要素を確保するところまでを、一度に書いているわけです。

この書き方のよいところは、コードが短くなって見やすくなることです。
特に、宣言した直後にすぐ要素を確保するのであれば、まとめて書いたほうが自然なことも多いです。

1つにまとめた書き方の意味を整理しよう

この書き方を見たときに、何をしているのかが頭の中で整理できると理解しやすくなります。

int[] data = new int[5];

このコードを分解すると、次のような意味になります。

部分意味
int[]整数の配列型
data配列変数の名前
new int[5]整数を5個入れられる配列を新しく作る
=作成した配列を配列変数に代入する

つまり、整数を5個入れられる配列を作って、その配列を data という名前で扱えるようにしているのです。

宣言と要素の確保をまとめたプログラム例

では、この書き方を使ったシンプルな例を見てみましょう。
ここでは、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ページです。

このプログラムでは、pages という配列を1行で準備し、そのあとで値を1つずつ代入しています。
配列の準備そのものはこれまでと同じですが、書き方がよりコンパクトになっています。

この図は、1つの文を書くだけで、配列変数の宣言と5個分の要素の確保が同時に行われていることを表しています。
箱の中はまだ空ですが、すでに値を入れる準備は終わっています。

この状態になれば、あとは pages[0] や pages[1] のように要素を指定して、必要な値を代入できます。

さらに便利な方法がある

ここまでの書き方では、配列の準備を1行にまとめることはできましたが、値の代入はまだ1つずつ行っていました。

int[] pages = new int[5];

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

もちろんこれでも正しく動きます。
ただ、最初から入れたい値が決まっているなら、これもまとめて書けたほうが便利ですよね。

そこで使うのが、配列の初期化です。

配列の初期化とは何か

配列の初期化とは、配列の宣言、要素の確保、値の代入をまとめて一度に行う書き方のことです。

書き方は次のようになります。

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

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

行われること内容
宣言pages という配列変数を用意する
要素の確保値の数に応じた配列を自動で作る
値の代入各要素に順番に値を入れる

この書き方では、new も要素数の指定も書いていません。
それでも、波かっこ {} の中に並べた値の個数を見て、Javaが自動的に必要な数の要素を用意してくれます。

なぜ要素数を書かなくてよいのか

ここはとても大事なポイントです。
配列の初期化では、値がいくつ並んでいるかをJavaが数えてくれます。

たとえば、

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

なら、値は5個あります。
そのため、Javaは自動的に「5個分の配列が必要だな」と判断して配列を作ります。

つまり、内部的には次のようなイメージです。

書き方実際の意味
int[] pages = {12, 18, 25, 10, 30};5個の要素をもつ配列を作り、順番に値を入れる

このように、最初から入れる値が決まっているときには、初期化の書き方がとても便利です。

配列を初期化するプログラム例

では、今度は配列の初期化を使ったプログラムを見てみましょう。
ここでは、1週間の水分補給量を表示するシンプルな例に変えて説明します。

ファイル名: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;
water = new int[5];

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

int[] water = new int[5];

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

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};

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

配列の初期化が向いている場面

配列の初期化はいつでも使うわけではありません。
特に向いているのは、最初から入れる値が決まっている場面です。

たとえば次のようなケースです。

向いている例理由
曜日番号に対応するデータ最初から内容が決まっている
定番の点数例学習用のサンプルとして固定できる
決まった5日分の記録あらかじめ値を並べて書ける
設定値の一覧開始時点で値が確定している

逆に、キーボード入力で後から値を入れるような場合は、最初に空の配列を作ってから1つずつ代入する方法のほうが向いています。

この図は、1つの文を書くだけで、配列変数の宣言、要素の確保、そして値の代入までが一度に行われる様子を表しています。
各箱には最初から値が入っているので、配列の準備が終わった瞬間に、そのまま使い始めることができます。

このイメージを持つと、初期化は「空の箱を作ってあとから値を入れる方法」ではなく、「箱を作ると同時に中身も入れておく方法」だと理解しやすくなります。

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

配列の初期化の大きな利点は、コードが短くなることだけではありません。
どのような値が入っているのかを一目で確認しやすいことも大きなメリットです。

たとえば、

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

と書かれていれば、配列の中身がすぐにわかります。

一方で、1つずつ代入していく書き方だと、

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

のようになり、内容を把握するまでに少し時間がかかります。

そのため、固定の値をまとめて扱う場合は、初期化の書き方のほうが読みやすいことが多いです。

配列の書き方はいくつかあるが、意味はつながっている

ここまで見てきた配列の書き方は、見た目は違っていても、本質的には同じ流れにつながっています。

  • 配列変数を用意する
  • 必要な要素数を確保する
  • 必要な値を入れる

この3つが配列の基本です。
初期化の書き方は、それらをまとめて簡潔に表したものです。

つまり、書き方が短くなったからといって、配列の仕組みが変わるわけではありません。
基本の流れを理解したうえで簡潔な書き方を見ると、Javaのコードがとても読みやすく感じられるようになります。

配列をまとめて初期化できると記述が自然になる

最初から入れる値が決まっている場合、配列の初期化はとても自然で便利な書き方です。
特に、学習用のサンプルプログラムや、固定のデータを使う処理では、コードがすっきりまとまり、内容も読み取りやすくなります。

また、配列の宣言と要素の確保を1つにまとめる書き方も、日常的によく使われます。
こうした書き方に少しずつ慣れていくと、Javaのコードを見たときに意味を素早く読み取れるようになります。

配列は、書き方がいくつかあるからこそ、場面に応じて見やすい形を選べるのがよいところです。まずは基本を押さえたうえで、こうしたまとめた書き方にも慣れていくと、配列の扱いがぐっとスムーズになっていきます。