今回やること
こんにちは!今回は「配列」についての解説をします!
配列は効率的なプログラムを作る上で外せない、大黒柱のようなものです。
配列は変数の拡張的な存在で、for文と併用することで超強力な力を発揮します!
今回のポイント
今回のポイントは以下の3つです!
配列が使いこなせるようになると、大幅にコーディングが楽になります!
ではいきましょう!
配列とは?
配列のイメージ
配列は、変数の拡張版のようなものです。
変数のイメージは、値が入る箱。だと変数の解説の際に説明しました。
それに対して配列のイメージは、ロッカーのようなものです。
配列とは、変数が連続的に並んでいるようなものです。
文章だけではイメージしづらいので、図と後述する具体例でイメージを掴んでいきましょう!
配列を使うシーン
配列は大量の変数を用意したい時に用いられます。
例えば、生徒10人のテストの平均点を知りたいとします。
テストの点数は変化するので、変数に格納したいですね。
ただそうなると、少なくとも10個の変数を個別に宣言しなければなりません。
左側の変数を使うものは気合いで書きましたが、めんどくさい...笑
こんな時に配列です!
配列であれば、右のように書けます!
for文などが出てきましたが、配列を使う方がすっきりした印象を持つと思います。
しかも、生徒が増えた場合、
左の変数を使う場合だと、25行目に変数を追加して、28行目に式を追加する必要があるのに対し、
右の配列を使う場合だと、3行目に点数を追加するだけで済みます。
10人なら変数でもなんとかできますが、100人とかになると...
と、このような時に配列を使います!
配列の使い方
宣言の仕方
配列の宣言の基本系は以下の2つの形です。
//要素で初期化
型[] 配列名 = {値1,値2,...};
//空の配列を作成
型[] 配列名 = new 型[要素数];
また、要素数とは、配列の中に格納できる値の個数のことです。
駅のロッカーでいう、ロッカーの数になります。
詳しく見ていきましょう!
要素で初期化
主に格納する値があらかじめ決まっていて、値に規則性がない場合に使います。
例えば、生徒のテストの点数だと以下のようにできます。
int[] points = {21,40,60,80};
メリットは、具体的な値がわかっていれば一番シンプルに書けることです。
デメリットは、要素数が多くなればなるほど大変になることです。
空の配列を作成
主に格納する値が決まっていないけれど、要素数(変数の数)がわかっている場合に使います。
例えば、とりあえず空の本棚だけ作って、何をしまうかは決めていない。だと以下のようにできます。
string[] bookshelf = new string[10];
メリットは、要素数がすぐにわかること。格納する値が決まっていなくても配列が作れることです。
デメリットは、別途初期値を設定しなければならないことです。
配列の要素
要素の参照
配列は変数ではないので、名前で参照するようなことはできません。
ただその代わり、インデックス(番号)で参照できます。
配列名[インデックス]
番号で参照できているのが確認できますが、違和感にお気づきでしょうか?
そう、1番目の要素がインデックス0に対応し、
5番目の要素がインデックス4に対応しています!
つまり、n番目の要素は、インデックス n-1 に対応しているということです!
なので、配列のインデックスは0から始まる!というのを必ず念頭に置いておきましょう!
(言語によっては1から始まるものもあります。ややこしい...)
要素の更新
配列の要素の値を更新したい(別の値に変えたい)場合は、参照して代入をします。
「配列名[インデックス]」が一つの変数のように扱えます。
値が更新されているのが確認できますね!
配列の要素数
配列の要素数は、以下の値に格納されています。
配列名.length
言語によって違いはありますが、どの言語にも配列の要素数を取得する方法は存在します。
配列の応用的な使い方
for文との組み合わせ
for文で初期化
値が規則的に並んでいる場合にとても有効です。空の配列を作った際によく使います。
for(int i = 0 ; i < 配列名.length ; i++){
配列名[i] = 値;
}
解説します!
- int i = 0で、最初のインデックスを決めています。今回は先頭からなので、0からですね。
- i < 配列名.lengthで、i が「要素数-1」 になるまで繰り返します。
i番目の要素が、i - 1のインデックスに対応しているので、
最後の要素は、要素数 -1 のインデックスになります。 - i++ でインデックスを一つずつ増やします。
for文で参照
上記の方法で、配列の要素を一つずつ参照します。配列では本当によく使います!
for(int i = 0 ; i < 配列名.length ; i++){
//配列名[i]を使った処理;
}
インデックスに対してcontinueや、breakも併用すると、特定の要素のみ参照できたりします。
今回は解説の量が多いので割愛します...
具体例
配列とfor文はかなり相性が良いです。
大規模プログラムなんかも元を辿れば、for文と配列の組み合わせのことが多いです。
多重配列
配列はロッカーのようなものだとお伝えしました。
現実のロッカーは上から2段目、左から4番目。のように1列のものだけではなく、2列のものもありますよね。
配列も2列,3列と作れます。
そして、行と列の2つの軸があるものを、2重配列、または2次元配列といいます。
3重配列、4重配列も作ることができ、それらを総称して多重配列と言います。
多重配列の宣言
基本は1次元の配列(1列のみ)と同じです。
以下は2重配列(2次元配列)の作り方です。
//要素で初期化
型[][] 配列名 = {{値1-1,値1-2, ...},{値2-1,値2-2, ...}, ...}
//空の配列を作成
型[][] 配列名 = new 型[要素数1][要素数2]
配列の中に配列があるようなイメージになるので、初期化などは少し工夫が要ります。
具体例
空の配列を作成して、初期値を入れて表示。までしています。
1行ずつ解説しますね!
- 1行目)宣言時に、3行、10列のint型2次元配列を作成
- 3行目)画像の2次元配列の縦方向に対して、要素数の分繰り返し
- 4行目)画像の2次元配列の横方向に対して、要素数の分繰り返し (1行目の要素数の分繰り返し)
- 5行目)初期化
- 6行目)画面に表示
- 8行目)一列分の表示が終わったら改行だけする
この時のポイントは、4行目の points[0].lengthとなっている部分です。
この時のインデックスはどの値でも良いのですが、どこかの行を指定して横方向の要素数をとっています。
多重配列の実際のイメージ
実は、コンピュータ内部では、2次元配列は以下のように扱われています。
1次元配列の中に1次元配列が格納されている感じです。
なので、実際のイメージとしては、マンションの階数と部屋みたいなものです。
しかし、人間が扱う分には表のように並べたもののほうが考えやすいので、ロッカーのイメージを持っていただきたいです。
マンション、アパート住みの人にはマンションの郵便受けをイメージしてもらうといいですね。
なので上の具体例で、points[0].lengthとできる理由がこれで明確になったかと思います!
配列の注意点
配列外参照エラー
配列の要素数を超えるインデックスを指定した場合、必ずエラーが起きます。
その理由は、バッファオーバーフローなどのメモリ系への攻撃を防ぐためです。
一部例外はありますが、配列を使っていてエラーが起きる場合は、配列の要素数を超えるインデックスを指定していないか。など
確認するようにしましょう!
配列のサイズを大きくしすぎない
配列は大きければ大きいほど、たくさん値が入るので、ぶっちゃけ便利です。
ですが、コンピュータは指定された配列の大きさの分、メモリなどの資源を確保しなければなりません。
したがって、大きすぎる配列を宣言すると、メモリを圧迫してパフォーマンス低下や動作不良などが起きます。
必要最低限の大きさの配列を宣言して使うようにしましょう!
まとめ
今回は配列の解説を行いました!
大規模なプログラムでは必ず使うので、これである程度規模の大きいプログラムも書けるようになりました!
言語によっては配列を発展させた「リスト」というものも使えます。
ですが、配列の仕様を理解していないと、配列もリストも使いこなせません。
ですが、ここまで読み解けた方であれば、配列について大方理解できた、と思います!
では今回のまとめです!
お疲れ様でした!
これで初心者向けの解説は一通りは完了です!
次回からは、学んだことを活かして、成果物を作りたいと思います!
お楽しみに!!
Take It Easy!
お疲れ様でした♪