【Java初心者】配列の仕組みと使い方

配列がどのような仕組みでできているのか、その使い方と利用シーン、例外が起こる場合についてまで解説していきます。

配列の仕組み

配列とは

配列とは、関連のある複数のデータを順番に並べて収納するデータ構造です。
もっと簡単に言い換えるといくつかの関係あるデータ同士を1つのグループにまとめて1つの変数に入れてしまうというイメージです。

複数のデータを関連性のあるもの同士で集めて管理していれば、それぞれの情報を変数に入れて扱うよりも好きな情報を好きな時に扱えるようになります。

例えば、1人のユーザー情報である「名前、生年月日、住所、血液型」などの情報をプログラムの中で扱いたい場合、変数に入れるとバラバラで誰の情報がそれぞれどれなのかわからなくなってしまいます。

一方で、配列であればこれらのデータを1人の人の関連したデータとして扱うことができるため、「この人の名前が知りたい!この人の住所が知りたい!」という局面ですぐにデータを取り出すことができます。

配列は、変数っぽい箱が連続して並んでいるイメージで、1つ1つの箱のことを配列の要素と呼びます。上の図では、名前、住所などが要素になっています。

配列のデータ型

配列に入る要素として使えるデータ型はintやstringなど、基本的に変数のデータ型と同一のものを扱うことができます。そして、配列に入れる各要素は全て同じデータ型でなくてはなりません。

⭕️ int[] a = {1,2,3};
❌ int[] b = {"a","b","c"};                 ⇦int型の配列に文字列は入れられない
❌ int[] c = {"d","e",4,5};                 ⇦複数のデータ型を入れるのもダメ!

記事の後半で説明していますが、配列も変数と同じように利用する前にはまず配列名と扱うデータ型の宣言を行いますので、そこで扱えるデータ型が決定するのです。

複数のデータが扱えるからといって、1つの配列にintやstring型のデータを共同生活させることはできないので注意しておきましょう!

配列の順番

配列は、関連のあるデータ同士を好きな順番に並べることができます。配列は、データを入れる箱である要素が順番に並んでおり、要素には前から順番に番号が振られているからです。この番号のことを添え字、あるいはインデックスと呼びます。

クラスの出席番号やテストの順位など、世の中の大半のことは1から始まりますが、配列は違います。配列のインデックス番号は0番目から始まります。

配列を使用するときは先頭から0番目、1番目、2番目、3番目、、、と繋がっていきます。この0番目から始まることを「ZeroOrigin」と呼ぶ者もいますので覚えておくと良いでしょう。

配列の使い方

配列の変数宣言

配列は、変数と同じように利用する前には変数宣言をする必要があります。普通の変数であれば、変数の箱を用意してそこに値を入れるだけでしたが、配列の変数宣言では2段階のステップを踏む必要があります。

  1. 配列のデータ型を決めて箱を作成する。
  2. 箱の中に入れる要素の数を確定する。(配列の長さを決める)

配列で重要になってくるのが要素の数を確定するという部分です。配列の長さを決めるとも言います。配列は長さを確定しなくては使用することができない点を覚えておきましょう。

int[] scores;
scores = new int[3];

まず配列の箱を作成する際には、配列内に入れる要素の型と配列名を確定します。その際に配列を表す意味として、要素の型の後ろに[]をつけます

配列の長さを決める場合には、new演算子を利用します。

new演算子は、[]内に書かれている数字の数だけnewの後ろのデータ型の要素を作成します

省略した配列変数宣言

上で説明したのは、配列の箱の作成と配列の長さの確定です。ですが、毎回配列を作成するために2行コードを書くのは大変なので配列の宣言は1行で記述することができます。1行で書く方法は主に3つあります。

1つ目は箱の作成と要素数の確定を同時に行う式です。箱の作成と同時にnew演算子で要素数を確定するだけです。
これは、配列に入れる値が確定していないときや後から配列に値を代入したい時に最もよく使われている書き方です。

int[] scores = new int[3];
データ型[] 配列変数名 = new データ型[要素数];

2つ目が、配列の作成、要素数の確定と同時に要素に値を入れておく方法です。これは初期値として要素に入れる値が最初から決まっている場合に利用する式です。以下のコードでは、5つの値が代入されているので配列の数が5個であることになり、new int[5]と同じ要素数の配列ができます

int[] scores = new int[]{100,90,80,70,60};
データ型[] 配列変数名 = new データ型[]{0番目に入れる値,1番目に入れる値,・・・・・・・};

3つ目は、2つ目の式を省略化した形です。以下のように配列変数宣言時に要素のデータ型を宣言しているので、代入される値は当然左側で指定したデータ型だろうという前提のもとで宣言されます。

int[] scores = {100,90,80,70,60};
データ型[] 配列変数名 = {0番目に入れる値,1番目に入れる値,・・・・・・・・・・・};

要素の初期値と数が確定している場合には3つ目を利用するといいでしょう。ただ、宣言したデータ型と違うデータ型の値を入れてしまうことのないように注意しましょう!

配列の初期化

変数では、変数宣言と同時に初期値を代入しておくのが一般的です。
逆に変数に初期値を入れずに使用しようとすると「変数が初期化されていません」というエラーが出てしまいます。

int score;
System.out.println(score);         ⇦scoreを初期化していないためコンパイルエラー

しかし、配列では要素の初期化をせずに使用してもコンパイルエラーにはなりません。

int scores = new int[];
System.out.println(scores[0]);     ⇦scoresの0番目を出力できる

なぜかというと、配列の要素は作成されたと同時に自動的に初期化されるためです。初期化される際の値は以下の通りです。

データ型初期値
int,long,doubleなどの数値型o
boolean型false
String型null

値を代入

配列の各要素に値を代入したり、使用したりする方法について説明していきます。

ただの変数では、宣言した変数に対して値をそのまま代入するだけで値を格納することができましたが、配列は値を入れる場所がいくつもあるためそのまま配列変数に代入することはできません。

int[] a = new int[5];
❌ a = 1;                           ⇦代入できない。

配列に値を代入するためには、何番目の要素に代入するか指定する必要があります。もちろん配列は0番目から始まるので配列の先頭に値を代入したい場合には0を指定する必要があります。

例えば、要素数が5個の配列の前から3番目に値を代入したい場合は要素番号が0,1,2,3,4となるので要素[2]に値を代入することになります。
また、[ ]で指定した要素は以下のコードではただのint型のデータであるため、以下のようにintの変数に代入したり、intの変数から値を代入してくることも可能です。

int[] scores = new int[5];
scores[2] = 10;                     ⇦前から3番目に値が代入される。
int a = 0;
a = scores[2];                         ⇦変数aに10が代入される。
scores[5] = a;

とにかく配列は、代入したい場所より指定する値が1つ小さいということに十分注意して代入を行いましょう!

配列の長さを取得

配列は、使用前に必ず長さを指定しますが、その配列の長さをすぐに調べることができます。配列の長さは計算で使用したりfor文の条件として使用したりすることができます。記述方法は以下の通りです。

配列名.length

例えば、配列に入っている値がintでその平均値を算出したい時になどに有効に利用することができます。

以下のコードでは、for文で配列の長さの回数だけループしています。ループ処理の中では、scores[i]はscoresのi番目を表しており、ループのたびにiの値は0,1,2……と1ずつ増えていくため、scores[i]の値は10,20,30…となり、配列の値を合計値sumに前から順番に入れています。

最後に合計値sumを要素数で割ることで平均値averageを算出しています。

int[] scores = {10,20,30,40,50,60,70};
int sum = 0;
int average = 0;
for(int i = 0; i<scores.length;i++){
    sum = sum + scores[i]; 
}
average = sum / scores.length;                    averageの値は40となる。280/7

配列使用時に起こる例外

配列使用時に最も起こりうる例外は、「ArrayIndexOutOfBoundsException」です。この例外は、日本語に訳すと指定している番号が配列の範囲外です。といった雰囲気の例外です。つまり、配列の長さ以上の範囲を指定してしまった時に起こる例外です。

int[] scores = {100,110,120};
int scoreA = scores[0];
int scoreB = scores[3];               ⇦存在しない要素を指定している。

上記のコードでは、配列scoresの要素は3つであるため、要素の指定できる番号としては[0][1][2]だけとなるが、scoreBに代入するところで[3]を指定してしまっています。このような場合に、ArrayIndexOutOfBoundsExceptionは発生しますのでこの例外が発生した場合には配列を使用している計算式を確認して修正しましょう!

以上、誰かの参考になれば嬉しいです。最後まで読んでいただきありがとうございます!