━目次━
プログラミングスクールで講師をしていることもあり、最近Javaの[参照型]や[参照渡し]、[Stringの特殊性]や[==とequals]などについて説明する機会が増えてきたので、
もうブログで講義作ったら良いんじゃね??
ってことでこれから数回に分けてここらを解説したいと思います。
尚、初学者がイメージを持ちやすいように簡単なコードと図を多用していきます。
よって難しい説明は極力割愛しますので、メモリ周りなど奥が深い部分は興味があれば自分で調べてみてください。
間違いがあれば指摘して頂けると助かります。
以下の題目で講義を進めていきます。
【1日目】値(プリミティブ)型と参照(オブジェクト)型の違いをコードと図で解説
【2日目】参照渡しとは?参照型の変数を代入した時の挙動を押さえよう!
【3日目】==とequalsの違いは図で理解すれば絶対間違えない
【4日目】イミュータブルな変数ってなんだ?String型変数の特殊性を知る
全4日です。週休3日です。なんてホワイトなんでしょう。
それでは、始まり始まり~(/・ω・)/
値(プリミティブ)型とは
値型は以下の8つのみです。
boolean | 1bit |
---|---|
byte | 8bit |
char | 16bit |
short | 16bit |
int | 32bit |
float | 32bit |
long | 64bit |
double | 64bit |
特徴としては、全て変数のサイズ(bit)が決まっているということです。
規定のサイズを超える値を格納することはできません。逆に言うと適切な型を使わないと無駄にメモリを使うことになります。
参照型とは
参照型はそれ以外の変数たちで、よく使うとこだと
String
配列
List系
DtoやFormなどのクラス etc…
などです。
参照型の特徴は、変数に格納されているのは「値」そのものではなく、値がメモリのどこに格納されているかを示す「参照値」ということです。
私はこれをいつも「ロッカーの鍵」に例えます。
実際に値が格納されているのはロッカーの中で、変数はロッカーの番号が書いた鍵のイメージですね。
オブジェクトは場合によってはけっこうサイズが大きくなります。
ロッカーを持ち運ぶのは大変ですけど鍵なら簡単に持ち運べますよね。
では図でイメージしていきましょう。
値型と参照型のメモリ確保のイメージ
値型の場合
まずは念のため値型の変数の中身を確認してみます。
1 2 |
int num1 = 1; System.out.println(num1); // 1 |
確かに1という値が格納されています。
値型の場合は、実際の値が変数に格納されるのでメモリ確保のイメージはシンプルです。
メモリの領域が2つに分かれているのは今は無視してください。
変数を宣言すると、メモリの「ある領域」に「1」という値が格納されます。
参照型の場合
参照型も同様に変数の中身を確認してみます。
1 2 |
int[] arr1 = {1,2,3}; System.out.println(arr1); // [I@7e41c839 |
良く分からない文字の羅列が出力されたと思います。
@以降の 7e41c839 というのが参照値と呼ばれるものです。
参照型はこのように参照値が変数に格納されているのでイメージはこういった感じになります。
先程「1」が格納されたエリアには「7e41c839」という参照値が格納され、実際の値である「{1,2,3}」は別の場所に保存されています。
右側のエリアがロッカーコーナーってことじゃな!
そういうことだね
スタック領域とヒープ領域
変数を保存するメモリの場所が2つ(水色とピンクのエリア)に分かれていると言いましたが、分かれている以上勿論名前があります。
水色のエリア(値型の値と、参照型の参照値が保存される)
スタック領域
ピンクのエリア(参照型の値が保存される)
ヒープ領域
ヒープ領域にはオブジェクトのインスタンス、実際の値や、メソッドが格納されます。
あるメソッドの中で宣言された変数(ローカル変数)は全てスタック領域に格納されます。
そして処理が終わると、格納していた値も破棄されます。
まずはこのように変数の型によってメモリの使い方が違うんだな、ということを覚えておいてください。
そしてこの図が頭に入っていると、今後の==とequalsの話の時に超理解し易くなります。
1日目はここまで
では1日目はここまでとしましょう。
ここでの話が2日目以降の基盤となるので、しっかり理解してください。
それでは!また明日!!
人気の記事だけ集めたので是非覗いていってください^^
厳選!目的別にオススメ記事を紹介-あなたの欲しい情報がここに-