Developer

【はじめてのJava】ラッパークラス【いろいろなクラス編】
2021.08.31
Lv1

【はじめてのJava】ラッパークラス【いろいろなクラス編】

はじめてのJava

このシリーズでは、初めてJavaやプログラミングを勉強する方向けに、Javaによるプログラミングの基礎を説明していきます。
目標レベルは、Javaの資格試験の一つである「Oracle Certified Java Programmer, Silver」(通称Java Silver)に合格できる程度の知識の習得です。
はじめてJavaやプログラムに触れる方にもできるだけわかりやすい解説を心がけていきます。


目次


ラッパークラスとは、基本データ型の値を参照データ型の値として扱うために用意されたクラスです。
以下、基本データ型とラッパークラスの組を表した表です。

基本データ型 ラッパークラス
int Integer
long Long
float Float
double Double
short Short
char Character
byte Byte
boolean Boolean

ラッパークラスもクラスなので、メソッドを持っています。今記事ではラッパークラスの主要なメソッドを紹介します。
・valueOf(String s)
Characterクラス以外のラッパークラスで定義されているメソッドです。String型のデータをそれぞれのラッパークラスのオブジェクトに変換して戻り値として返すメソッドです。
使用例

Integer i = Integer.valueOf("100");
Double d = Double.valueOf("123.456");

のように記述して文字列からラッパークラスのオブジェクトを取得することが出来ます。
・parse〇〇(String s)
Characterクラス以外のラッパークラスで定義されているメソッドです。〇〇はラッパークラスごとに異なる単語が入りますが、メソッドの動作は共通しています。
その動作は、引数として渡された文字列を、各ラッパークラスが対応する基本データ型の値に変換して戻り値として返すというものです。
各ラッパークラスにおける名称を以下の表にまとめました。

ラッパークラス parse〇〇(String s) 戻り値
Byte parseByte(String s) byte
Short parseShort(String s) short
Integer parseInt(String s) int
Long parseLong(String s) long
Float parseFloat(String s) float
Double parseDouble(String s) double
Boolean parseBoolean(String s) boolean

・〇〇Value()
全てのラッパークラスで定義されているメソッドです。〇〇にはラッパークラスごとに異なる単語が入りますが、メソッドの動作は共通しています。
その動作は、メソッドを実行するオブジェクトに格納された値を、各ラッパークラスが対応する基本データ型の値として戻り値を返すというものです。
各ラッパークラスにおける名称を以下の表にまとめました。

ラッパークラス 〇〇Value() 戻り値
Byte byteValue() byte
Short shortValue() short
Integer intValue() int
Long longValue() long
Float fooatValue() float
Double doubleValue() double
Boolean booleanValue() boolean

文字列を基本データ型の値へと変換できるメソッドなので重用するメソッドです。


AutoBoxingとAutoUnBoxing

ラッパークラスを利用して、基本データ型の値を参照型の値として扱うことが出来るようになるという話をしました。
この時、基本データ型の値をラッパークラスに格納して参照型の値として扱う処理のことをBoxingと呼んでいます。
逆に、ラッパークラスのオブジェクトに対して、メソッドを実行してオブジェクトから基本データ型の値を取り出す処理のことをUnBoxingと呼んでいます。

以前は、こうしたBoxingやUnBoxingの処理はその都度コードの中に記述する必要がありました。
しかし、JDK5以降はBoxingおよびUnBoxingの処理を自動化したAutoBoxingおよびAutoUnBoxingという機能が装備されています。
AutoBoxingは基本データ型の値を対応するラッパークラスに割り当てるための機能であり、その際に必要となる変換処理を自動化したものです。
AutoUnBoxingはラッパークラスから対応する基本データ型に割り当てるための機能であり、その際に必要となる変換処理を自動化しています。
AutoBoxingらが使えない場合、BoxingとUnBoxingの処理はプログラマが随時記述する必要があります。
例えば、Doubleクラスのオブジェクトを引数に受け取り、そのオブジェクトの持つ値を2乗した値を持つDoubleクラスのオブジェクトを戻り値として返すareaOfSquareメソッドを記述するとします。
AutoBoxingが使用できない場合、

public Double areaOfSquare(Double side){
	double d = side.doubleValue();	//UnBoxing
	double a = d * d;
	return new Double(a);		//Boxing
}

のように記述することになります。
上記のコードでは、2行目でDoubleクラスからdouble型の値を取り出しています。
そして、4行目で計算したdouble型の値をDoubleクラスに格納して戻り値として返しています。
AutoBoxingが使用できる場合、

public Double areaOfSquare(Double side){
	return side * side;
}

のようにBoxingとUnBoxingの処理を省略して記述することが出来ます。

BoxingとUnBoxingの処理を自動でしてくれるAutoBoxingですが、記述する際に注意点が存在します。
それは、基本データ型を自動で割り当てられるのは、その基本データ型が対応しているラッパークラスだけであるという点です。
例えば、int型のデータをIntegerクラスに自動で割り当てることはできますが、short型のデータをintegerクラスに自動で割り当てることはできないなどです。

short s = 5;
int i = s;		//暗黙の型変換により代入可能
Integer wi = s;	//short型をInteger型に代入することはできないためエラー

暗黙の型変換による代入が可能なため、short型をInteger型に代入できると混同してしまいがちなので注意しましょう。
AutoBoxingが適用されるのは、intとInteger、doubleとDoubleというように、それぞれ対応する基本データ型とラッパークラス間でのみとなっています。

また、

Short s = 10;
int i = s;

とした場合はコンパイルエラーにはなりません。Short型の変数をint型の変数に代入しようとしていますが、この場合はShort型の変数からshort型の値へとAutoUnBoxingされた後に暗黙の型変換による代入が行われます。

その他に、

Short s = 10;
Integer i = s;

という、Short型からinteger型への代入のパターンが考えられます。
この場合はコンパイルエラーとなります。

ラッパークラスの変数を基本データ型の変数のように扱うことが出来ますが、これはAutoBoxingによって自動でBoxingやUnBoxingが行われているということを意識して今後はコードを記述しましょう。


ポイント

ラッパークラスのメソッドを活用することで、文字列から基本データ型の値を取得することが出来る。
AutoBoxingという、自動で基本データ型とラッパークラスのBoxingやUnBoxingを行う機能によって、コードを短縮して記述できている。