Javaのラッパークラスとは?必要な理由とオートボクシング・アンボクシングの使い方
ラッパークラス(Wrapper class)とは、プリミティブデータ型(int、char、short、byteなど)を包み込んで扱うためのクラスです。言い換えると、ラッパークラスを使うことで、プリミティブデータ型をオブジェクトとして操作できるようになります。
Javaでは、各プリミティブ型に対応するラッパークラスがjava.langパッケージに用意されています。主な対応関係は以下のとおりです。
- byte → Byte
- short → Short
- int → Integer
- long → Long
- float → Float
- double → Double
- char → Character
- boolean → Boolean
なぜラッパークラスが必要なのか
Javaにはプリミティブ型があるのに、わざわざラッパークラスが必要な理由はいくつかあります。
- プリミティブ型をオブジェクトに変換できる:メソッドに渡した引数の中身を変更したい場合、プリミティブ型は値渡し(pass by value)のため元の値を変更できませんが、オブジェクトなら参照を通じて操作できます。
- java.utilパッケージのクラスはオブジェクトしか扱えない:ユーティリティ系の多くのクラスはオブジェクトを前提としているため、その場合にもラッパークラスが役立ちます。
- コレクションフレームワークとの連携:ArrayListやVectorなどのデータ構造は、オブジェクト(参照型)のみを格納でき、プリミティブ型は直接扱えません。
- マルチスレッドでの同期処理:synchronization(同期)をサポートするには、ロックの対象となるオブジェクトが必要です。
Javaにおけるラッパークラスの実装
オートボクシング(Autoboxing)
オートボクシングとは、プリミティブデータ型を対応するラッパーオブジェクトへ自動的に変換する仕組みです。明示的に変換メソッドを呼ばなくても、代入時に自動で変換されます。
サンプルコード
public class AutoBoxingTest {
public static void main(String args[]) {
int num = 10; // プリミティブ型のint
Integer obj = Integer.valueOf(num); // ラッパークラスのオブジェクトを生成
System.out.println(num + " " + obj);
}
}
実行結果
10 10
アンボクシング(Unboxing)
アンボクシングはその逆で、ラッパークラスのオブジェクトを対応するプリミティブデータ型へ変換する処理です。
サンプルコード
public class UnboxingTest {
public static void main(String args[]) {
Integer obj = new Integer(10); // ラッパークラスのオブジェクトを生成
int num = obj.intValue(); // ラッパーオブジェクトをプリミティブ型へ変換
System.out.println(num + " " + obj);
}
}
実行結果
10 10
なお、new Integer(10) のようなコンストラクタによる生成はJava 9以降非推奨となっており、現在は Integer.valueOf(10) を使うのが推奨されています。また、Java 5以降はボクシング・アンボクシングが自動化されているため、Integer obj = 10; や int num = obj; のように簡潔に記述することも可能です。
-
Javaのfinalクラスとは?継承を禁止する仕組みと使い方を徹底解説
Javaにおいて、クラスにfinal修飾子を付けて宣言する最大の目的は、そのクラスがサブクラス化(継承)されることを防ぐことです。クラスがfinalとして宣言されると、どのクラスもそのクラスを継承できなくなり、finalクラスの機能や振る舞いを拡張・変更することが不可能になります。finalクラスの基本構文finalクラスの宣言は非常にシンプルです。クラス名の前にfinalキーワードを付けるだけです。public final class Test { // クラスの本体 }このように宣言されたTestクラスに対して、以下のような継承を試みるとコンパイルエラーが発生します。// コンパイ
-
Javaで多重継承がサポートされていない理由とは?曖昧性の問題をわかりやすく解説
Javaでは、1つのクラスが複数のクラスを同時に継承(extends)することはできません。そのため、次のようなコードはコンパイルエラーとなり、不正な記述として扱われます。不正なコードの例public class extends Animal, Mammal{}一方で、Javaのクラスは1つ以上のインターフェースを実装(implements)することが可能です。この仕組みによって、多重継承が持つ利点の多くを補完できるようになっています。多重継承が禁止されている理由最大の理由は、曖昧性(あいまいさ)の発生を防ぐためです。具体的に考えてみましょう。仮にクラスBがクラスAとクラスCの両方を継承できる