配列の宣言と初期化
Java言語に限らず、プログラミングを行う際にはどの言語でも必ず変数を用いることになります。
多くの場合、変数には宣言と初期化が必要です。宣言とは、ある変数をこれから使えるようにする、と宣言し、その変数のためにメモリ上に適切なサイズの領域を確保することです。そして、初期化とは、最初にその領域に値を代入し、使えるようにすることです。
言語の種類にってよっては、宣言を省略することも可能ですが、そのような言語の場合、最初に値が代入された段階で、宣言と初期化がなされたとみなされます。
Javaで変数を使う際には、必ず宣言と初期化をしなくてはいけないという決まりになっています。
普通の変数の初期化
例えば、int型の変数aを使えるようにするには、以下のように
int a;
としなくてはなりません。これにより、はじめて整数型変数aが使えるようになります。その後、
a = 5;
のように値を代入すると、初めて変数aが使えるようになります。変数を宣言し、最初に初期値を代入することを初期化と言います。
もしも、この初期化を行わずにaの値を元にして何らかの演算処理などを行おうとすると、例外が発生し、プログラムが強制終了されてしまいます。
Javaの配列変数は自動的に初期化される
ただ、配列の場合は少し事情が異なります。例えば、配列の宣言は、以下のように行います。
int n = new int[10];
double d = new double[5];
これらはそれぞれ、長さ10の整数型配列であるn、長さ5の実数型配列dの宣言です。この状態で、値は0で自動的に初期化されるのです。
つまり、配列変数に関しては、初期化を省略することが可能なのです。
Java言語は、C言語をもとにして作られた言語なのですが、C言語では、配列を宣言した状態では値が初期化されることは無く、宣言と初期化の二度処理をしなくてはならず、大変面倒でした。
Java言語はその教訓を活かして、プログラマーの手間を省けるように工夫されているのです。
なぜ初期化が必要なのか
変数の初期化が必要な理由は、もしも初期化をしない状態でその変数を用いて演算処理を行おうとすると、例外(実行時エラー)が発生し、プログラムがとまってしまうからです。
ただし、前述の通り、配列変数の場合は例外です。配列変数は、配列変数を宣言した状態で、初期化が行われています。
配列以外の変数の場合は、一つだけ値を設定すればよいので楽ですが、配列の場合数が多いので、初期化をするのは大変です。そのため、Java言語では、宣言をした状態で、0などのデフォルトの値が設定されるようになっており、初期化の手間を最小限にできるような仕組みがあらかじめ用意されているのです。
ちなみに、配列の値が文字列の場合は、空文字列(くうもじれつ)となります。これは、中身が空っぽの文字列と言う意味で、文字列自体は存在するものの、長さが0、つまり何も書かれていない空っぽの文字列という意味です。
データが何も無いというnullとは明確に意味が違いますので、注意が必要です。
一次元配列の初期化
Javaでは、配列が自動的に初期化されるものの、配列でも0もしくは空文字ではないあらかじめ決められた値で初期化をしたい場合も少なくありません。そのような場合、配列の一つ一つの値を順次値を代入していくのは大変です。
そこで、Java言語には、初期化子(しょきかし)という、配列変数の初期化を容易にする非常に便利な仕組みを用意してくれています。例えば、
int a[] = { 1, 2, 3 };
のように宣言すると、自動的に以下のような処理をしたのと同じことになります。
int a[] = new int[3];
a[0] = 1;
a[1] = 2;
a[2] = 3;
配列変数の初期化
文字列の場合も同じです。例えば、
String [] s = {“apple”,”banana”,”orange”};
といったようにすると、
String[] s = new String[3];
s[0] = “apple”:
s[1] = “banana”;
s[2] = “orange”;
つまり、初期化子を使えば、配列の宣言と初期化を同時に行うことが出来ます。これにより、ソースコードが非常に短く出来ると共に、すっきりとして大変読みやすくなります。
長さが極端に長い配列は別として、あらかじめ数がわかっていて、初期化する値が決まっている場合は、この初期化子を用いると、配列の扱いが手軽に出来ます。
多次元配列の初期化
初期化子は、一次元配列のみならず、多次元配列でも用いることが出来ます。例えば、整数の配列を
int num[][] = {{10, 8, 5}, {9, 16, 4}, {3, 7, 5}};
二次元配列の初期化
とすると、以下と同じ処理を行ったことになります。これにより、3×3の格子の中に初期値が自動設定された状態で配列変数numを利用することが可能なのです。
なお、このような初期化は不揃いでもかまいません。例えば、
int a[][] = {{1, 2, 3},{4},{5,6,7,8}};
ジャグ配列の初期化
とすると、不揃いな形の配列が出来上がります。
これも二次元配列の一種なのですが、一般にこのようなタイプの配列をジャグ配列(jagged array)といいます。ただ、このジャグ配列という言葉は正式な呼び名ではなく、マイクロソフトが開発したC#言語の用語のものです。
ちなみに、ジャグ(jagged)とは、「ギザギザ」という意味で、文字通りぎざぎざの形状をした配列のことです。
初期化の際の注意点
このように大変便利な配列の初期化子なのですが、使用する際には制約があります。それは、配列を宣言する段階で、初期化する全て値が決まっていることです。
また、初期化しなくてはならないようなデータがたくさんある場合も不向きです。理論的には、100個でも、1000個でも、初期化子を用いて宣言と初期化を行うことは可能ですが、プログラマーがそれを行うことはほぼ不可能でしょう。初期化子を用いる場合、データはあくまでもプログラマーが視認できる範囲内の数に抑えておく必要があります。
なので、配列の初期化を行う場合には、通常のように宣言と初期化の処理を分けるか、それとも初期化子を用いるかは、状況に応じて臨機応変に変えていく必要があります。
ただ、初期化子を含むJavaのソースコードは気をつけないと複雑になりがちです。そのため、配列以外にもコメントをつけるなどして、少しでもソースコードを読みやすくする工夫も必要です。
Javaの配列と初期化の利点
以上がJavaの配列の初期化の説明です。Java言語には、プログラマーが配列変数を扱う際に宣言と初期化をするたに様々な仕組みが用意されていることがわかります。プログラマーはこの仕組みを有効に活用すると、読みやすく、かつデバッグのしやすいプログラムを作ることが可能なのです。
Javaが使える方は高単価な仕事ができる可能性があるので下記記事もぜひご覧くださいませ!
【関連記事】
▶Java案件のイマがわかる!知って見つかる最適案件