名古屋のITエンジニア向け研修会社。目次Toggleなぜ、配列の理解が重要なのか、その理由。1.配列の使い方2.ArrayIndexOutOfBoundsException3.参照とハッシュ値4.配列の要素を一度に表示する5.拡張for文6.2次元配列7.配列とオブジェクト指向なぜ、配列の理解が重要なのか、その理由。この記事では、弊社の新人エンジニア研修の参考にJavaを解説します。前回は繰り返し処理について解説しました。コンピュータのすごさがあらためて感じられたのではないでしょうか?今回は配列の作成と使用について解説します。これまで学んだとおり、プログラムでは基本的に変数に値を入れて処理をしていくのでした。変数が10個、20個、100個と増えていったらどうなるでしょうか?名前を考えるだけでも大変ですね。そんな時に便利なのが配列です。配列のイメージは同じ型の複数の値を入れる入れ物(変数)が並んだものです。(下図参照)添字【index】を使って要素を指定しますからデータの探索も高速です。配列のイメージ1.配列の使い方1.配列を表す変数を宣言します。ages;データ型の後の[](角カッコ)が単なる変数ではなく配列であることを表しています。2.配列の要素を確保します。[]の中の数値が要素数を表します。int[3]new演算子というものが使われています。new演算子はJavaでインスタンス化(実体化)を行う際に使われるものです。インスタンスについては後述します。この段階では配列の中身は0が詰められている状態です。(下図参照)配列の初期値は0である3.添字を用いて要素を指定し、配列に値を入れていきます。51;このとき添字は0から始まるので、0,1,2と添字は2までしかないことに注意しましょう。配列の添字(index)は0~(要素数-1)4.配列に入っている値を添字を用いて参照します。System.out.println(ages[2]);51が表示されます。初学者に多い間違いは配列の添字(上記の2)と要素(上記の51)を混同することです。Example01は配列の要素をfor文の繰り返しにより表示します。以下のExample01は配列の要素をfor文の繰り返しにより表示します。}}<実行結果>102051この例では、配列の要素を繰り返しによって表示させています。このように、配列とfor文は相性が良いです。配列の大きさ(要素の数)は次のようにして確認できます。変数名.length変数名.lengthという表現を使えば、上記のfor文は以下のようにも書けます。}}マジックナンバーが消えて意味が分かりやすく、また配列要素数の変更にも強いプログラムになりました。以下Example03の6行目のように配列を一度に初期化する方法もあります。}}<結果>は先と同じ。この場合には、3という要素数は自動で決まります。デバッガで配列の要素を表示すると以下のように見えます。以下の配列の場合、ages.lengthの値と最大の添字を答えなさい。int[3];添字は0から始まるので、0,1,2の3つの要素が用意されるのでした。}}以下のようなメッセージが出てプログラムの実行が中断されました。chap06.Example04.main(Example04.java:8)このように存在しない要素にアクセスしようとした場合は、例外が発生します。今回発生した例外は、ArrayIndexOutOfBoundsExceptionという名前です。【Array:配列】の【Index:添字】が【OutOfBounds:範囲を超えた】【Exception:例外】という意味です。配列は英語でarrayといいます。array】「整列させる」という英語のイディオムを覚えた方もいるかも知れませんね。これらのエラーメッセージにも意味がありますので、知らないものに遭遇したときには必ず、グーグルなどで調べるようにしてください。目を背けてはいけません。「前もってIDEが例外の発生を教えてくれたらいいのに」と思ったかもしれません。詳しくは例外のところで後述しますが、この例外はコンパイラがチェックしてくれない例外なのです。コンパイラがチェックしてくれないので非チェック例外といいます。プログラマの責任で対処すべき例外なのです。3.参照とハッシュ値ところで、上記の例では、ages[0]には10が、ages[1]には20が、ages[2]には51が入っていました。agesという変数には何が入っているのでしょうか?System.out.println(ages);としてみると、[I@15db9742上記の文字列が表示されました。この文字列の@以降はハッシュコードと呼ばれるものです。ハッシュコードはデータの置き場所であるメモリのアドレスだと思っていただければ大きく違ってはいません。beef】などと同じ語源です。”は配列であることを意味しています。ここまでのところを図解すると下図のようになります。1JVMが管理するメモリ領域には大きく分けてスタック領域とヒープ領域の2つがあります。スタック領域はローカル変数やメソッドが格納される領域です。【stack】には英語で「積み重ねた」という意味があります。First-Out】。ヒープ領域はインスタンスが格納される領域です。個人的には“インスタンス”領域と呼んでもいいと思うのですが、英語の【heap】に「山積み、山盛り」という意味があり、メモリ容量が大きくなる可能性があるインスタンスはこのヒープ領域に格納されるのです。スタック領域に格納されるプリミティブ型のデータは大きくてもdouble型の64bitです。対して配列などのインスタンスはどれだけ大きくなるかわからないためヒープ領域に格納します。例えるなら、家具屋さんで、店頭にはカタログだけ用意して、大きな商品は倉庫に置いておくようなイメージでしょうか。メモリ内の動作のイメージ12メモリにはアドレスがあります。ローカル変数に格納されるのは、配列が格納される予定のヒープ領域の先頭アドレス(ここでは15db9742)です。(下図参照)メモリ内の動作のイメージ23要素がヒープ領域に格納されます。(下図参照)メモリ内の動作のイメージ3このような仕組みのため、System.out.println(ages);とすると以下の表示になるわけです。[I@15db9742なお、Javaの参照型は以下の3つに整理されます。配列と、クラス(インスタンス)とインタフェースです。次回学ぶ文字列はクラス型に分類できます。これまでに学んだ型の知識を下図で整理しておきます。a2[0]);メモリ管理を意識することはC言語にも通じるJavaでメモリ管理を意識することは、C言語にも通じる重要な概念です。C言語では、プログラマが直接メモリを管理するため、メモリリークやバッファオーバーフローなどの問題に注意が必要です。Javaはガベージコレクション機能を持ち、メモリ管理が自動化されていますが、それでもメモリ効率を考慮することが重要です。オブジェクトの過剰な生成や長時間の保持は、Javaのヒープメモリを圧迫し、パフォーマンス低下を引き起こします。ちなみに、Javaのスタックとヒープというメモリ概念はC言語から受け継がれたものです。4.配列の要素を一度に表示する標準出力を使って配列の要素を一度に表示するにはどうしたらよいでしょうか?毎回、繰り返し処理を使って表示させるのもおっくうです。そんな時に便利なのが配列の要素を文字列化してくれるArraysクラスのtoString()メソッドですArrays.toString()の意味は【Arrays】「配列を」【toString】「文字列へ」ということで、名が体を表すネーミングですね。デバッグ時に便利ですので覚えておいてください。以下のExample05は配列の要素を一度に表示します。java.util.Arrays;」という一文を挿入する必要があります。IDEを使うと簡単に挿入できますので講師に教わってください。importの意味は、2回目の記事でお話ししました。配列と相性が良いのが拡張for文です。拡張for文は、配列の先頭から最後までを連続して処理するときに簡潔に書ける構文です。配列の要素を0番目から一つずつ一時的な変数に格納して処理します。配列の変数)初学者の方はforの()の中の変数宣言と配列の変数指定の順番を逆にしないように気をつけてください。区切りは;(セミコロン)ではなく(:コロン)ですので間違えないようにしましょう。便利なIDEのコードテンプレートを使えば間違いないですが。この(:コロン)は「中の」といった程度の意味です。以下のExample06で確認してみましょう。{System.out.println(age);}}}<実行結果>102051このようにほんの少しですがシンプルに書くことができました。この拡張for文はのちにコレクション(ArrayList)というものを学んだ時にも活躍しますので、今のうちに慣れておいてください。繰り返し処理をするために一時的に“使い捨て”の変数ageを使っています。この変数の値を繰り返し処理の中で変更しても元の配列には影響しませんので注意してください。以下はそのことを示すサンプルコードです。配列の要素をそれぞれ2倍にしたつもりですが、できていません。}}<実行結果>102051102051変数ageがローカル変数である以上、当然といえば当然ですが間違えやすいところです。ローカル変数が不要になり、先ほどのArrayIndexOutOfBoundsExceptionが発生する危険も無くなります。通常のfor文と比較した場合の拡張for文の制限は、必ず配列の先頭からの処理となることです。配列の後ろから処理をしたい場合は、直接対応できません。逆順にソートしておく前処理が必要になります。配列の要素を一つおきに飛ばして処理を加えたい場合などにはあまり向かないでしょう。そもそも配列やコレクションフレームワークが無ければ拡張for文は使えません。したがって通常のfor文が不要になるわけではありませんが、拡張for文が使える場面では拡張for文を優先させて下さい。拡張for文は、このあとコレクションフレームワークというものを学ぶと重宝しますので。次のfor文の繰り返し回数を答えなさい。}6.2次元配列ここまで作成してきた配列は1列でしたので1次元配列と呼ばれます。それに対して、2次元以上の配列を多次元配列といいます。ここでは、例として2次元配列を見ていきましょう。イメージとしてはエクセルの表に少し似ています。下図のように本当は1次元の配列を複数用意したものです。2次元配列の本当の姿Example08以下のExample08は2次元配列の例です。}}<実行結果>403010,20,30,40,50,60,70,80,90,10,20,30,このようにシンプルに書けるのが拡張for文の良いところです。拡張for文を入れ子にしていたところも大事です。2次元以上の配列について、研修では深入りしませんので、このサンプルコードを示すだけとします。7.配列とオブジェクト指向なお、配列の利用場面はかつてほどではありません。配列は要素数を後から変更できません。型の異なるデータを同じ配列に入れることもできません。これら配列の弱点を克服したArrayListについては後で学びましょう。※例えば、Androidの正式開発言語となったKotlinはJavaの後継言語とも目されていますが、配列は存在せず、常にArrayクラスを使います。昔は(といっても1990年代です)、オブジェクトという考え方が一般的でなく配列を使った処理を多用していました。以下は5名の生徒の成績を管理するプログラムです。80イメージは下図の通りです。何でも配列に入れていた時代もあったしかし、現代では1人分のデータは1人分のオブジェクト(より正確にはインスタンス)として表現することが一般的です。この点は何度も繰り返しお伝えしていくテーマなので、今は用語に慣れる程度で結構です。参照にはハッシュコードが入っているまとめができたら、アウトプットとして演習問題にチャレンジしましょう。セイコンサルティンググループ変数が100個あったとしたら名前を考えるだけでもひと仕事です。セイコンサルティンググループ以上、今回は「配列を使い大量データを便利に扱う」方法について見てきました。次回は、「文字列を扱ってユーザーにメッセージを伝える」です。最後までお読みいただきありがとうございます。