よしたろうブログ

設計・人文知・歴史・哲学・漫画とかの話が好きです。

【Java】ラッパークラスの意義について

ラッパークラスとは?

基本(プリミティブ)型である int や double の値をオブジェクトとして扱えるように用意されているのがラッパークラス。ラッパーとはwrapper(覆うもの)を意味。

データは大きくプリミティブと参照型に分類されます。

最小単位となるデータの記述方法を元から定めてしまっているものを,プリミティブ型と呼びます

プリミティブ型とは、プログラミング言語などが仕様として提供する基本的なデータ型。または、定義に他のデータ型を用いない独立したデータ型。

参照型というのは,実際にデータを格納しているポインタ(メモリ上のアドレス:住所みたいなもの)を保持するようなデータ型のことです。後述します。

プリミティブ型(組み込みデータ型 / 基本データ型)とは - 意味をわかりやすく - IT用語辞典 e-Words

各プリミティブに対応したラッパークラス

プリミティブは全部小文字

ラッパークラスは頭文字が大文字

プリミティブラッパークラス
boolean Boolean
byte Byte
charCharacter
intInteger
longLong
shortShort
doubleDouble
floatFloat

オブジェクトとして扱えると何がいいの?

インスタンス宣言によりインスタンス化することでメソッドを呼び出してデータを処理することができるようになります。

例えばIntegerなら、

  • Integer.parseInt(String)で文字列をint型に変換
  • Integer.valueOf(int)でint型を文字列に変換

上記のメソッドは、int型の変数では使えませんがInteger型では使用することができます。

オートボクシング(Autoboxing)・アンボクシング(Unboxing)

  • オートボクシング:プリミティブ型からラッパークラスへの変換
  • アンボクシング:ラッパークラスからプリミティブ型への変換

本来、以下のようにラッパークラスのインスタンス生成した後にその値をプリミティブなint に代入しようとすれば以下の手順が必要です。

Integer integerNum = new Integer(16);

int intNum = integerNum.intValue();

ところがアンボクシング機能によって以下の書き方で変換が自動で行われます。

Integer integerNum = new Integer(16);

int intNum  = integerNum;

オートボクシングも同じですね。

オートボクシングを使用することでラッパークラスのオブジェクトをあたかも基本データ型のように扱うことができます。

余談ですが、学習し初めの頃この機能のせいで int と integer の何が違うの??と、混乱したことがあります。笑 まあ色々と違うところ沢山あるんで、冷静に考えればわかったんですけどね。。。

注意点

ラッパークラスは参照型のため、nullが入る可能性があります。 nullが入ったラッパークラスのインスタンスをアンボクシング機能を使ってプリミティブ型へ変換するとNullPointerExceptionが発生します。

参照型変数は参照を持つことで「インスタンスを指す」状態になります。 これを、参照の代わりに「null」という値を入れることで、「どのインスタンスも指していない」状態になってしまいます

Integer integerNum = null;
int intNum =  integerNum; //実行時NullPointerException発生

参照型について

プリミティブ型はメモリに直接書き込まれる具体的なデータ値(数値や文字)を代入することができます。

それに対して参照型は、メモリに格納された値でなく値が格納されたメモリのポインタ(メモリ上のアドレス:住所みたいなもの)を参照値として代入しています。

値そのものを保持するのではなく、値が置いてある場所を保持するのが参照型のようですね。

参照しているところのポインタに実際に格納されている値が変わってしまえば参照型の値も変わってしまう問題は容易に想像できますよね。

あるメソッドには決められた引数しか渡してはいけない場合、その引数が参照型の変数であった場合、具合悪い事が発生しそうな場合がありそうですね。 この辺りは既に多くの方が記事にしているので、こちらでは書きません。

めんどくさいし、完全に理解してるわけじゃないし

参照型の参考記事を以下に貼ります。 続きはここを読んでくださればわかると思います。非常に解りやすい良記事でした。

cod-aid.com

nobuo-create.net