Javaのプリミティブ型と参照型について

# 前書き
　プリミティブとラッパークラスについて、そしてその周辺の内容も含めて、自分なりにまとめた記事です。
　現在、Java Silverの資格取得に向けて学習中で、あくまでそのレベルで理解出来ていることを書いているので、多少の厳密さや正確さを欠いている場合があります。ご了承下さい(間違っていたら、そっと教えてください)。



# 対象読者
・Javaの資格取ろうかなって思っている人
・プリミティブとか、ラッパークラスとかオートボクシングとか、ちょっと何言っているか分からないってなった人

# キーワード
プリミティブ型、参照型、ラッパークラス、オートボクシング、アンボクシング


# プリミティブ(型)とは？
**[ざっくりした定義]**
・Javaのデータ型の一つ
・Javaのいわゆる基本な型のことで、値型とも言う
・メモリのスタック領域に値が入っている

**[種類]**
全部で8種類あります。
表現できる値の範囲は、覚えなくてもいいかなと思います(~~なので途中で書くのやめました~~ )。
ビット数は覚えてもいいかと思います、ビット数が大きいほど表現できる範囲は広いです[^10]。

|データ型|表現できる値や範囲|ビット(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型に変換する場合でも使います、詳しくは次章で)。

# オートボクシング・アンボクシングとは？
ここまでの説明を踏まえて、定義を書くと

　オートボクシング：プリミティブ型からラッパークラスへの自動変換
　アンボクシング　：ラッパークラスからプリミティブ型への自動変換[^15]

です！スポーツのボクシングとは関係ないと思います、知らんけど[^20]！
プリミティブ型を自動でラップする( = 箱に入れる)からオートボクシング、その逆に箱から取り出すからアンボクシングなんだと思います。

実際のコードだと、こんな感じ(参考7より引用)。

```java
// オートボクシング
int numInt = 10;
Integer numInteger = numInt;

// アンボクシング
Integer numInteger = new Integer(10);
int numInt =  numInteger;

```

オートボクシング・アンボクシングを図解すると、こんな感じ。

```markdown
　　　　　　　　　　オートボクシング
　　　　　　　　　　　　＝＝＞　　
　　[プリミティブ型]　　　　　　　　[ラッパークラス]　　
　　　　　　　　　　　　＜＝＝
　　　　　　　　　　アンボクシング
```


あ、ちなみにですが、上記で自動変換と書いたということは、明示的にオートボクシング、アンボクシングを行うこともできます(参考7より引用)。

```java
// オートボクシング
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-808[^30]
　試験時間：150分
　問題数：77問
　合格ライン：65%

# 参考
本記事を書くにあたり、下記の書籍・サイトを参考にしました。この場を借りて、感謝申し上げます。
どの参考も、私の説明よりずっとずっと分かりやすいので、ご一読オススメします！

1. 志賀澄人　(2019)　「徹底攻略　Java SE 8 Silver 問題集 [1Z0-808] 対応」　㈱インプレス 発行
2. [【Java】値(プリミティブ)型と参照(オブジェクト)型の違いをコードと図で解説《講義1日目》][ref2]
3. [プリミティブ型【変数の型】][ref3](「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典)
4. [図で理解するJavaの参照][ref4]
5. [【Java入門】Integerとラッパークラスの基礎の基礎をわかりやすく解説！][ref5]
6. [ラッパークラスの種類][ref6]
7. [【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

[^10]: 例えば、byteなら8ビットなので、|2^(8-1)|の範囲の整数を表現できます(符号で1バイト使うので乗数は1少ないです)。
[^15]: オートアンボクシングではないんですね、不思議。
[^20]: 語源的な意味では、関係あるかもですね . . . 。
[^30]: 日本語での試験ってことなら、「1Z0-808 JPN」みたいです(試験の申込ページでは、そんな区分でした)。