概要
Javaのデータ型にはプリミティブ型と参照型があります。
ここではそれぞれの型はどのようにデータを保持しているのか?
また、どのような種類があるのか?
について学んでいきます。
プリミティブ型とは?
値を直接保持しているデータ型です。
これは参照型との対比で違いがわかるので、まずは「普通に値を持っているデータ型なんだな」という理解でOKです。
<プリミティブ型 一覧>
以下にデータ型と持つことができる値の範囲を示します。
データ型 | 意味 | 値の範囲 |
---|---|---|
boolean | 二者択一条件を表す | true, false |
char | 16ビットのUnicode文字 | \u0000~\FFFF |
byte | 8ビットの整数 | -128~127 |
short | 16ビットの整数 | -32768~32767 |
int | 32ビットの整数 | -2147483648~2147483647 (-21億4748万3648~21億4748万3647) |
long | 64ビットの整数 | -9223372036854775808~9223372036854775807 (-922京3372兆0368億5477万5808~922京3372兆0368億5477万5807) |
float | 32ビットの単精度浮動小数点 | 負数:-3.4028235E+38 ~ -1.401298E-45 正数:1.401298E-45 ~ 3.4028235E+38 |
double | 64ビットの単精度浮動小数点 | 負数:-1.79769313486231570E+308 ~ -4.94065645841246544E-324 正数:4.94065645841246544E-324 ~ 1.79769313486231570E+308 |
参照型とは?
直接データを保持せず、データを保持しているメモリ上の位置情報を参照しているデータ型です。
参照型には以下の3種類のデータ型があります。
オブジェクト型
Object型を親とするクラスとして定義されたデータ型です。
良くみるオブジェクト型は、String型、ArrayList型、Integer型などがあります。
列挙型
複数の定数を1つにまとめておくことができるデータ型です。
定数は変わることのない値です。
配列
複数の値を持つことができる構造のデータ型です。
[]で表すことができます。(String[] argsなど)
プリミティブ型と参照型の違いを図解
プリミティブ型と参照型は、データを保持する方法が異なることは前述しました。
それを図解すると以下のようになります。
※「@6x3skzuz」はヒープ領域を参照するアドレスです。
スタック領域:ヒープ領域の参照情報やプリミティブ型の値を保持する領域
ヒープ領域 :参照型のインスタンス(オブジェクト型や配列型の実際の値)を保持する領域
プリミティブ型と参照型を意識しなくてはいけない理由
プログラミングをしていて、あるデータを別の変数にコピーすることがあります。
そのとき、プリミティブ型と参照型は異なる挙動をします。
プリミティブ型はコピーしても元の値が変更されることはないため、予期しない動作になることはありません。
しかし、参照型は同じ参照先を見ているため、コピー先の変更がコピー元の変更にもなってしまいます。
これはバグを生む可能性につながります。
そのため、参照型を扱う場合は変更されたインスタンスが他から参照されていないようにするか、新しく別のインスタンスを作って別物として扱うようにする必要があるということを覚えていてください。
まとめ
- データ型にはプリミティブ型と参照型がある。
- プリミティブ型は値を直接保持するデータ型である。
- 参照型は値を保持しているメモリ領域(ヒープ領域)を参照するアドレスを保持している。
- 参照型はその性質から、コピー先での変更がコピー元の変更にもなってしまうということに注意する。
コメント