ラッパークラス

基本データ型とラッパークラス

intやdoubleなどといった基本データ型は、データそのものなので、オブジェクトとして扱うことができません。しかし、ArrayListなどといったコレクションや、ジェネリクスなどでは、基本データ型を使用しなくてはならないケースがしばしば存在します。そのような場合、基本データ型に相当するクラスとして、ラッパークラスが用意されています。

ラッパークラスのラップとは、“包み込む”という意味で、基本データ型をラッパークラスによって包み込むことを意味します。Javaの基本データ型には、それぞれ以下のように、該当するラッパークラスが存在します。ラッパークラスの名前は、基本データ型の頭文字を大文字にしたものが基本になっています。

Javaのラッパークラス
基本データ型ラッパークラス
byteByte
charCharacter
shortShort
intInteger
longLong
floatFloat
doubleDouble
booleanBoolean

ラッパークラスの利用

ラッパークラスの生成

ラッパークラスの生成には、大きく分けて二つの方法があります。一つは、通常のクラスの場合と同様、newを用いて生成する方法、そしてもう一つが、staticなメソッドvalueOfを利用する方法です。以下、それぞれの方法を紹介します。

ラッパークラスの生成①:newを用いる方法
Integer i1 = new Integer(10); //int型をコンストラクターの引数にとる
Integer i2 = new Integer("10"); //Stringで表されたint型を引数にとる
ラッパークラスの生成②:valueOfメソッドを利用する方法
Double d1 = Double.valueOf(3.14);    //double型を引数に
Double d2 = Double.valueOf("3.14"); //Stringで表されるdouble型を引数に

なお、Characterクラスには文字列を引数とするvalueOf()メソッドは存在しません。

メソッド

ラッパークラスには、保持する基本データ型の値を処理するメソッドが定義されています。ここでは、その中でも代表的なメソッドを紹介します。

(1)parse~()メソッド

文字列を基本データ型へ変換するstaticなメソッドです。以下のように使用します。

parseメソッド
int i = Integer.parseInt("10");
double d = Double.parseDouble("10.0");
(2)~Value()メソッド

数値を扱う6つのラッパークラスのオブジェクトを基本データ型の値へ変換するインスタンスメソッドです。引数は必要ありません。使用方法は以下の通りになります。

~Value()メソッドを利用する方法
Integer i = new Integer(14); //Integerオブジェクトを生成
double d = i.doubleValue(); //double型に変換
System.out.print(d); //"14.0"と出力される

引数として与えた値が、ラッパークラスに対応する基本データ型ではない場合、NumberFormatExceptionが発生しますので、注意してください。なお、このメソッドも、ValueOfの場合と同様、Characterクラスには定義されていません。

(3)equals()メソッド

Stringクラスの場合と同様、==がオブジェクト同士が等しいかどうかを比較するのに対し、equalsメソッドは、オブジェクトの中身を比較するようになっています。

equalsメソッド
Integer i1 = new Integer(10); //int型をコンストラクターの引数にとる
Integer i2 = new Integer(10); //Stringで表されたint型を引数にとる
System.out.print(i1.equals(i2));    //trueが出力される System.out.print(i1==i2); //falseが出力される

この例では、ラッパークラスIntegerのオブジェクトi1および、i2は、それぞれ別物であることから、「==」の場合はfalseとなりますが、値はそれぞれ10と等しいので、equalsメソッドの結果はtrueとなります。

ボクシング変換

データ型とラッパークラスの交換

ラッパークラスと基本データ型の変換は、容易に行うことができます。それが、ボクシング変換と呼ばれるものです。ボクシング変換には、大きく分けて、基本データ型からラッパークラスへ自動的に変換するAutoboxingと、ラッパークラスから基本データ型へ自動変換する、Unboxingとが存在します。

Autoboxing

では、最初にAutoboxingの例を見てみましょう。

Autoboxingの例
int i1 = 5;
Integer i2 = i1;      //int型の値をIntegerへ(Autoboxing)

これにより、i2は自動的に値として5を持つInteger型のラッパークラスのオブジェクトとして生成されます。

Unboxing

今度は、Unboxingの例を見てみることにしましょう。

Integer i1 = new Integer(10); //int型をコンストラクターの引数にとる
int i2 = i1; //Integerを、int型へ(Unboxing)

これにより、変数i2の値は10になります。

ボクシング変換のメリット

このようなボクシング変換ができるメリットは、ラッパークラスと基本データ型を全く意識せずに使うことができる点にあります。たとえば、以下のような処理を行うことができます。

様々なボクシング変換が行われている例

今度は、Unboxingの例を見てみることにしましょう。

Integer i = new Integer("5"); //ラッパークラスのオブジェクトを生成
i++;                //インクリメント
System.out.print("i = " + i); //"i = 6とが出力される

インクリメント演算子は数値演算をするものなので、オブジェクトをインクリメントすることはできないはずです。しかし、このような演算が行えるのは、ボクシング変換により、データ型と対応するラッパークラスの変換が自動的に行われているからなのです。

そのため、ジェネリクスやコレクションで基本データ型を利用する場合、ボクシング変換により自動的にデータ型とラッパークラスの変換が行われ、あたかもジェネリクスやコレクションで基本データ型が扱えるようになっているように見えるわけです。