ラッパークラス
基本データ型とラッパークラス
intやdoubleなどといった基本データ型は、データそのものなので、オブジェクトとして扱うことができません。しかし、ArrayListなどといったコレクションや、ジェネリクスなどでは、基本データ型を使用しなくてはならないケースがしばしば存在します。そのような場合、基本データ型に相当するクラスとして、ラッパークラスが用意されています。
ラッパークラスのラップとは、“包み込む”という意味で、基本データ型をラッパークラスによって包み込むことを意味します。Javaの基本データ型には、それぞれ以下のように、該当するラッパークラスが存在します。ラッパークラスの名前は、基本データ型の頭文字を大文字にしたものが基本になっています。
Javaのラッパークラス基本データ型 | ラッパークラス |
---|---|
byte | Byte |
char | Character | short | Short |
int | Integer |
long | Long |
float | Float |
double | Double |
boolean | Boolean |
ラッパークラスの利用
ラッパークラスの生成
ラッパークラスの生成には、大きく分けて二つの方法があります。一つは、通常のクラスの場合と同様、newを用いて生成する方法、そしてもう一つが、staticなメソッドvalueOfを利用する方法です。以下、それぞれの方法を紹介します。
ラッパークラスの生成①:newを用いる方法Integer i2 = new Integer("10"); //Stringで表されたint型を引数にとる
Double d2 = Double.valueOf("3.14"); //Stringで表されるdouble型を引数に
なお、Characterクラスには文字列を引数とするvalueOf()メソッドは存在しません。
メソッド
ラッパークラスには、保持する基本データ型の値を処理するメソッドが定義されています。ここでは、その中でも代表的なメソッドを紹介します。
(1)parse~()メソッド文字列を基本データ型へ変換するstaticなメソッドです。以下のように使用します。
parseメソッドdouble d = Double.parseDouble("10.0");
数値を扱う6つのラッパークラスのオブジェクトを基本データ型の値へ変換するインスタンスメソッドです。引数は必要ありません。使用方法は以下の通りになります。
~Value()メソッドを利用する方法double d = i.doubleValue(); //double型に変換
System.out.print(d); //"14.0"と出力される
引数として与えた値が、ラッパークラスに対応する基本データ型ではない場合、NumberFormatExceptionが発生しますので、注意してください。なお、このメソッドも、ValueOfの場合と同様、Characterクラスには定義されていません。
(3)equals()メソッドStringクラスの場合と同様、==がオブジェクト同士が等しいかどうかを比較するのに対し、equalsメソッドは、オブジェクトの中身を比較するようになっています。
equalsメソッド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の例Integer i2 = i1; //int型の値をIntegerへ(Autoboxing)
これにより、i2は自動的に値として5を持つInteger型のラッパークラスのオブジェクトとして生成されます。
Unboxing
今度は、Unboxingの例を見てみることにしましょう。
int i2 = i1; //Integerを、int型へ(Unboxing)
これにより、変数i2の値は10になります。
ボクシング変換のメリット
このようなボクシング変換ができるメリットは、ラッパークラスと基本データ型を全く意識せずに使うことができる点にあります。たとえば、以下のような処理を行うことができます。
様々なボクシング変換が行われている例
今度は、Unboxingの例を見てみることにしましょう。
i++; //インクリメント
System.out.print("i = " + i); //"i = 6とが出力される
インクリメント演算子は数値演算をするものなので、オブジェクトをインクリメントすることはできないはずです。しかし、このような演算が行えるのは、ボクシング変換により、データ型と対応するラッパークラスの変換が自動的に行われているからなのです。
そのため、ジェネリクスやコレクションで基本データ型を利用する場合、ボクシング変換により自動的にデータ型とラッパークラスの変換が行われ、あたかもジェネリクスやコレクションで基本データ型が扱えるようになっているように見えるわけです。