42
41

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Last updated at Posted at 2020-02-24

前書き

 プリミティブとラッパークラスについて、そしてその周辺の内容も含めて、自分なりにまとめた記事です。
 現在、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%

参考

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

  1. 志賀澄人 (2019) 「徹底攻略 Java SE 8 Silver 問題集 [1Z0-808] 対応」 ㈱インプレス 発行
  2. [【Java】値(プリミティブ)型と参照(オブジェクト)型の違いをコードと図で解説《講義1日目》][ref2]
  3. [プリミティブ型【変数の型】]ref3
  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

  1. 例えば、byteなら8ビットなので、|2^(8-1)|の範囲の整数を表現できます(符号で1バイト使うので乗数は1少ないです)。

  2. オートアンボクシングではないんですね、不思議。

  3. 語源的な意味では、関係あるかもですね . . . 。

  4. 日本語での試験ってことなら、「1Z0-808 JPN」みたいです(試験の申込ページでは、そんな区分でした)。

42
41
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
42
41

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?