※本サイトで紹介している商品・サービス等の外部リンクには、アフィリエイト広告が含まれる場合があります。
こんにちは。こんぶです。
今日は、拡張for文やメモリについて学んでいきましょう!
私の自己紹介等は、こちらからどうぞ。
また、Javaの学習を最初から進めていきたい方は、Java-1から見てみてくださいね。
拡張for文
拡張for文とは、配列の要素を1つずつ取り出すループを簡単に書くための特殊なfor文のことです。
前回の「【Java-23】配列②for文との組み合わせ」で説明した配列の全要素の利用を、さらに簡単なコードにしたものですね。
拡張for文で配列を回すと次のようになります。
イメージしやすいように、通常のfor文と拡張for文で書いたものを比べてみましょう。
どちらも配列を回しており、出力結果も同じになりますが、拡張for文の方がコードが簡潔になっていますね。
ちなみに、拡張for文で任意の変数名を指定するのは、配列の要素を1つずつ受け取る一時的な変数が必要だからです。
拡張for文のメリットは、ループ変数や配列の添え字を記述する必要がなくなるため、ミスを減らし、スッキリしたコードを書けるところです。
通常のfor文と拡張for文どちらの書き方でも書けるように、どちらも覚えておきましょう。
メモリ
変数と配列の仕組みについて詳しく理解するために、変数と配列を作成した時のメモリの状況や、片付け等について、説明しておこうと思います。
変数とメモリ
メモリの中は区画に分けられていて、各区画にはアドレス(住所のようなもの)が振られています。
変数を宣言すると空いている区画を変数のために確保(使用する区画数は変数の型によって異なります)し、変数に値を代入すると確保しておいた区画に値が記録されます。
配列とメモリ
配列変数を宣言すると、要素の型の要素が指定数入る区画がメモリ上の区画に作成されます。そして、配列変数がメモリ上に作成されます。その後、配列(要素の型の要素が指定数入る区画)の先頭要素のアドレスが配列変数に代入されます。
例えば、「int[] number = new int[3];」を実行する場合は、int型の要素を3つ持つ配列がメモリ上に作成され、int[]型の配列変数 number がメモリ上に作成され、その後 配列変数 number に配列の先頭要素のアドレスが代入されます。
つまり配列変数は、配列の実体(要素の集まり)は○○番地(先頭要素のアドレス)にあるということを指し示してくれる動きをするということですね。
この動きを「参照」と呼び、メモリ上の番地を代入する変数のことを「参照型変数」といいます。(例:int[]等)
ちなみに、配列変数ではなく「int型」や「boolean型」等は「基本型変数」といいます。
複数の変数で同じ配列を参照すると…
配列では、変数自体には番地(先頭要素のアドレス)が入っており、実体はその番地から始まるメモリ上の区画にあると説明しました。
では、配列変数Aと配列変数Bで同じ配列を参照する(配列変数Aを配列変数Bに代入する場合等)とどうなるかというと、どちらかを書き換えるともう片方も変更されることになるんです。
同じ配列を参照するということは、配列の実体(要素の集まり)が同じということになるので、片方の中身を書き換えることで、どちらも書き換わってしまいます。
ガベージコレクション
配列変数も寿命は宣言されたブロックが終了するまでですが、確保されたメモリ(配列の実体がある要素の集まり)は通常の変数ではないためブロックが終了しても寿命を迎えることはなく、結果としてどの配列変数からも参照されない状態でメモリに残ってしまいます。
そのままでは、どこからも参照されないメモリが容量を圧迫してしまうのですが、Javaではプログラムが生み出したメモリ上のゴミを自動的に片付けてくれる「ガベージコレクション」という仕組みが常に動いているため、明示的にメモリの片付けを指示する必要がありません。
ガベージはゴミという意味なので、メモリ内のゴミを片付けてくれるというイメージですね。
参照を切る
「何もない」状態を表す値である「null」を使用することで、意図的に配列を参照されないようにすることができます。
「null」は参照型の変数に代入することができ、「null」を代入することで どこも参照しない状態になります。
このように、ある番地を参照していた配列変数に「null」を代入して参照しない状態にすることを「参照を切る」ともいいます。
参照されない配列は、ガベージコレクションの対象にもなります。
ちなみに配列変数に「null」を代入した場合、どこも参照していない状態ではありますが、コンパイルは成功し、実行した時にエラーになります。格納されている配列変数を参照した時にエラーがでるため、実行のタイミングなんですね。
今回のまとめ
★拡張for文で配列を回すと次のようになる
★変数を宣言すると空いている区画を変数のために確保し、変数に値を代入すると確保しておいた区画に値が記録される
★配列変数を宣言すると、要素の型の要素が指定数入る区画がメモリ上の区画に作成され、配列変数もメモリ上に作成される。その後、配列の先頭要素のアドレスが配列変数に代入される。
★配列変数は、配列の実体(要素の集まり)は○○番地(先頭要素のアドレス)にあるということを指し示す動きをする
★メモリ上の番地を代入する変数のことを「参照型変数」という
★「null」を参照型の変数に代入すると、意図的に配列の参照を切ることができる
・拡張for文:配列の要素を1つずつ取り出すループを簡単に書くための特殊なfor文のこと
・ガベージコレクション:プログラムが生み出したメモリ上のゴミを自動的に片付ける仕組み
次回は、配列の第4弾として「length」や「多次元配列」について説明していこうと思います。
今回の内容のチャレンジ問題はこちらです→チャレンジ問題【Java-24】
次の内容に進む方はこちらです→【Java-25】配列④length、多次元配列
それでは、こんぶはじゃ~
コメント