前書き
プリミティブとラッパークラスについて、そしてその周辺の内容も含めて、自分なりにまとめた記事です。
現在、Java Silverの資格取得に向けて学習中で、あくまでそのレベルで理解出来ていることを書いているので、多少の厳密さや正確さを欠いている場合があります。ご了承下さい(間違っていたら、そっと教えてください)。
対象読者
・Javaの資格取ろうかなって思っている人
・プリミティブとか、ラッパークラスとかオートボクシングとか、ちょっと何言っているか分からないってなった人
キーワード
プリミティブ型、参照型、ラッパークラス、オートボクシング、アンボクシング
プリミティブ(型)とは?
[ざっくりした定義]
・Javaのデータ型の一つ
・Javaのいわゆる基本な型のことで、値型とも言う
・メモリのスタック領域に値が入っている
[種類]
全部で8種類あります。
表現できる値の範囲は、覚えなくてもいいかなと思います(なので途中で書くのやめました )。
ビット数は覚えてもいいかと思います、ビット数が大きいほど表現できる範囲は広いです1。
データ型 | 表現できる値や範囲 | ビット(bit) | 具体例 |
---|---|---|---|
boolean | true, false | 1 | |
byte | -128 ~ 127 の整数 | 8 | |
char | \u0000 ~ \uFFFF のUnicode文字列 | 16 | |
short | -32768 ~ 32767 の整数 | 16 | |
int | 整数 | 32 | |
float | 実数(単精度不動小数点数) | 32 | 2f, 100F |
long | 整数 | 64 | 10l, 5L |
double | 実数(倍精度不動小数点数) | 64 |
参照型とは?
[ざっくりした定義]
・Javaのデータ型の一つ
・Stringとか、配列とか、Listとかのこと
・メモリのスタック領域には変数の参照値(ポインタ)が、ヒープ領域にはその参照値が指すオブジェクト(≒インスタンス)が入っている
プリミティブ型と参照型における代入の際の挙動の違いは[参考2][ref2]がとても詳しいので、そちらをご覧ください (今回の本題はそこではないので、先に進みます)
ラッパークラスとは?
[ざっくりした定義]
・参照型に分類される、プリミティブ型たちの進化系クラス ← 強そう
・それぞれのクラスに、便利なメソッドが用意されている
・プリミティブ型っぽく振る舞うけど、中身はnullの可能性がある(なので、ヌルポに注意)
プリミティブ型をラップしている(包んでいる)から、ラッパークラスなのでしょうね!中身はプリミティブ型という訳です。
こちらも、プリミティブ型に対応付ける形で表にしてみます(一部を除いて、プリミティブ型と同じ形をしていますね!)。
プリミティブ型 | ラッパークラス |
---|---|
boolean | Boolean |
byte | Byte |
char | Character |
short | Short |
int | Integer |
float | Float |
long | Long |
double | Double |
便利なメソッドと書きましたが、例えばInteger
なら、Integer.parseInt(String)
で文字列をint型に変換、Integer.valueOf(int)
でint型を文字列に変換するなど、色々用意されています(後者は、明示的にInteger型に変換する場合でも使います、詳しくは次章で)。
オートボクシング・アンボクシングとは?
ここまでの説明を踏まえて、定義を書くと
オートボクシング:プリミティブ型からラッパークラスへの自動変換
アンボクシング :ラッパークラスからプリミティブ型への自動変換2
です!スポーツのボクシングとは関係ないと思います、知らんけど3!
プリミティブ型を自動でラップする( = 箱に入れる)からオートボクシング、その逆に箱から取り出すからアンボクシングなんだと思います。
実際のコードだと、こんな感じ(参考7より引用)。
// オートボクシング
int numInt = 10;
Integer numInteger = numInt;
// アンボクシング
Integer numInteger = new Integer(10);
int numInt = numInteger;
オートボクシング・アンボクシングを図解すると、こんな感じ。
オートボクシング
==>
[プリミティブ型] [ラッパークラス]
<==
アンボクシング
あ、ちなみにですが、上記で自動変換と書いたということは、明示的にオートボクシング、アンボクシングを行うこともできます(参考7より引用)。
// オートボクシング
int numInt = 10;
Integer numInteger = new Integer(numInt);
// または以下
Integer numInteger = Integer.valueOf(numInt);
// アンボクシング
Integer numInteger = new Integer(10);
int numInt = numInteger.intValue();
終わりに
最後まで読んで下さり、ありがとうございます!
おまけ
試験情報(参考1より)
科目:Java SE 8 Programmer I
試験番号:1Z0-8084
試験時間:150分
問題数:77問
合格ライン:65%
参考
本記事を書くにあたり、下記の書籍・サイトを参考にしました。この場を借りて、感謝申し上げます。
どの参考も、私の説明よりずっとずっと分かりやすいので、ご一読オススメします!
- 志賀澄人 (2019) 「徹底攻略 Java SE 8 Silver 問題集 [1Z0-808] 対応」 ㈱インプレス 発行
- [【Java】値(プリミティブ)型と参照(オブジェクト)型の違いをコードと図で解説《講義1日目》][ref2]
- [プリミティブ型【変数の型】]ref3
- [図で理解するJavaの参照][ref4]
- [【Java入門】Integerとラッパークラスの基礎の基礎をわかりやすく解説!][ref5]
- [ラッパークラスの種類][ref6]
- [【Java】オートボクシング、アンボクシング][ref7]
[]: URL一覧
[ref2]: https://freelance-jak.com/technology/java/1175/
[ref3]: https://wa3.i-3-i.info/word15876.html
[ref4]: https://qiita.com/hysdsk/items/2e94c8722dc8f950e77c
[ref5]: https://www.sejuku.net/blog/22828
[ref6]: https://www.javadrive.jp/start/wrapper_class/index1.html
[ref7]: https://qiita.com/chihiro/items/870eca6e911fa5cd8e58