ラッパークラス:基本データ型をオブジェクトとして扱う

docs

以前、Javaの基本データ型について学びましたね。

データ型を使いこなそう (整数、小数、真偽値など) | ToolDocs


intdouble など、数値を直接扱うためのものでした。でも、Javaは「すべてがオブジェクト」という考え方を大切にする言語です。

あれ? 基本データ型ってオブジェクトじゃないよね? じゃあ、オブジェクトとして扱いたいときはどうするの?

そこで登場するのが、今回の主役「ラッパークラス」です!


ラッパークラスって何?

簡単に言うと、ラッパークラスは基本データ型をオブジェクトとして包み込む(ラップする)ためのクラスです。それぞれの基本データ型に対応するラッパークラスが存在します。

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

Google スプレッドシートにエクスポート

見ての通り、基本データ型が小文字で始まるのに対し、ラッパークラスは大文字で始まるのが特徴です。int だけは Integer と少し形が違うので注意してくださいね。


なぜラッパークラスが必要なの?

「わざわざ基本データ型をオブジェクトにする意味ってあるの?」と思うかもしれません。これにはいくつかの理由があります。

1. コレクションフレームワークを使うため

Javaには、複数のデータを効率的に管理するための「コレクションフレームワーク」という便利な機能があります。例えば、データのリストを扱う ArrayList などがそうです。

しかし、コレクションフレームワークは、基本データ型を直接扱うことができません! オブジェクトしか入れられないんです。

そんな時、ラッパークラスが活躍します。

Java

import java.util.ArrayList;
import java.util.List;

public class WrapperExample1 {
    public static void main(String[] args) {
        // NG: ArrayListは基本データ型を直接扱えない
        // List<int> numbers = new ArrayList<>(); // コンパイルエラー!

        // OK: Integerクラスを使ってint型の値をオブジェクトとして扱う
        List<Integer> numbers = new ArrayList<>();
        numbers.add(10); // int型の10が自動的にIntegerオブジェクトに変換される(オートボクシング)
        numbers.add(20);
        numbers.add(30);

        System.out.println("リストの要素: " + numbers); // 出力: リストの要素: [10, 20, 30]

        // リストから値を取り出すと、自動的に基本データ型に戻る(アンボクシング)
        int firstNum = numbers.get(0);
        System.out.println("最初の要素: " + firstNum); // 出力: 最初の要素: 10
    }
}

この例のように、ArrayList の中に int 型の数字を入れたい場合、Integer というラッパークラスを使うことで可能になります。

paizaで実行した結果

2. nullを扱いたい場合

基本データ型は、常に何らかの値を持ちます。例えば int 型は、何も値を入れないとデフォルトで 0 になります。しかし、**「値がない」状態(null)**を表現したいことがあります。

例えば、ユーザーからの入力で数値が入ってこなかった場合、「0」として扱いたくないですよね。そのような場合にラッパークラスを使えば、null を代入できます。

Java

public class WrapperExample2 {
    public static void main(String[] args) {
        // 基本データ型はnullを代入できない
        // int age = null; // コンパイルエラー!

        // ラッパークラスはnullを代入できる
        Integer userAge = null;
        if (userAge == null) {
            System.out.println("ユーザーの年齢は未設定です。"); // 出力: ユーザーの年齢は未設定です。
        }

        userAge = 25; // 後から値を設定することも可能
        System.out.println("ユーザーの年齢: " + userAge); // 出力: ユーザーの年齢: 25
    }
}

データベースから値を取得する際など、値が存在しない可能性がある場合に非常に便利です。

paizaで実行した結果

3. オブジェクトが持つ便利なメソッドを使いたい場合

ラッパークラスは、基本データ型にはない便利なメソッドを提供しています。

例えば、文字列を数値に変換したり、数値を文字列に変換したりする際に利用できます。

Java

public class WrapperExample3 {
    public static void main(String[] args) {
        // 文字列 "123" をint型に変換
        String strNum = "123";
        int num = Integer.parseInt(strNum);
        System.out.println("文字列をintに変換: " + num); // 出力: 文字列をintに変換: 123

        // int型 456 を文字列に変換
        int value = 456;
        String strValue = String.valueOf(value); // StringクラスのvalueOfメソッドも使える
        // または、Integer.toString() メソッドも使える
        // String strValue = Integer.toString(value);
        System.out.println("intを文字列に変換: " + strValue); // 出力: intを文字列に変換: 456

        // int型の最大値・最小値を取得
        System.out.println("intの最大値: " + Integer.MAX_VALUE); // 出力: intの最大値: 2147483647
        System.out.println("intの最小値: " + Integer.MIN_VALUE); // 出力: intの最小値: -2147483648

        // Doubleクラスの例
        String priceStr = "99.99";
        double price = Double.parseDouble(priceStr);
        System.out.println("文字列をdoubleに変換: " + price); // 出力: 文字列をdoubleに変換: 99.99
    }
}

これらのメソッドは、特にプログラミングでよくある「文字列と数値の変換」の場面で大活躍します。

paizaで実行した結果


オートボクシングとアンボクシング

上の例でちょっと触れましたが、Java 5以降では「オートボクシング」と「アンボクシング」という便利な機能が追加されました。

  • オートボクシング (Auto-boxing): 基本データ型の値を、自動的に対応するラッパークラスのオブジェクトに変換してくれる機能です。 int10Integer オブジェクトに自動で変換してくれます。
  • アンボクシング (Unboxing): ラッパークラスのオブジェクトを、自動的に対応する基本データ型に戻してくれる機能です。 Integer オブジェクトを int 型の変数に代入すると、自動で基本データ型に戻してくれます。

これらが登場したことで、ラッパークラスの利用がぐっと簡単になりました。以前は手動で変換メソッドを呼び出す必要があったのですが、今は気にせず使えます。

Java

public class AutoBoxingUnboxing {
    public static void main(String[] args) {
        // オートボクシングの例
        Integer objInt = 100; // int型の100が自動的にIntegerオブジェクトに変換される
        System.out.println("オートボクシング: " + objInt); // 出力: オートボクシング: 100

        // アンボクシングの例
        int primInt = objInt; // Integerオブジェクトが自動的にint型に変換される
        System.out.println("アンボクシング: " + primInt); // 出力: アンボクシング: 100

        // 演算も可能
        Integer a = 50;
        Integer b = 20;
        int sum = a + b; // aとbが自動的にアンボクシングされて計算される
        System.out.println("計算結果: " + sum); // 出力: 計算結果: 70
    }
}

便利ですが、裏側で変換処理が行われていることは頭の片隅に置いておくと、いざという時に役立つかもしれません。特に、大量の変換処理が発生する場合は、パフォーマンスに影響が出ることがごく稀にあります。

paizaで実行した結果


どこで使うの? 具体例をもう少し

データベースとの連携: データベースのカラムには「値がない」ことを意味する NULL が存在します。これをJava側で扱う際に、IntegerDouble などのラッパークラスを使用すれば、null を表現できます。

Webアプリケーション開発: Webフォームから送られてくるデータは、ほとんどが文字列です。これを数値として扱う場合、ラッパークラスの parseInt()parseDouble() メソッドを使って変換します。

数値の比較: equals() メソッドを使って、ラッパークラスオブジェクトの値を比較したい場合。基本データ型は == で値を比較しますが、オブジェクトの場合は equals() を使うのが一般的です。

Java

Integer num1 = 100; Integer num2 = 100; Integer num3 = 200; 
System.out.println(num1 == num2); // 環境によってはtrueになるが、非推奨 // キャッシュされた値の範囲内だとtrueになりやすい 
System.out.println(num1.equals(num2)); // 出力: true (推奨) System.out.println(num1.equals(num3)); // 出力: false

== 演算子は、オブジェクトの場合、参照しているメモリ上のアドレスが同じかどうかを比較します。一方、equals() メソッドは、オブジェクトが持つが同じかどうかを比較します。ラッパークラスでは、通常 equals() を使うのが安全です。

paizaで実行した結果


まとめ

今回は、Javaで基本データ型をオブジェクトとして扱いたいときに使う「ラッパークラス」について見てきました。

  • ラッパークラスは、基本データ型をオブジェクトとして包み込むためのクラス。
  • コレクションフレームワークを使ったり、null を扱ったり、便利なメソッドを使ったりする際に必要。
  • Java 5以降の「オートボクシング」と「アンボクシング」のおかげで、基本データ型とラッパークラスの変換がとても手軽になった。

「すべてがオブジェクト」というJavaの思想の中で、基本データ型もオブジェクトの仲間入りをさせるための重要な仕組みでしたね。

これで、Javaの基本データ型とオブジェクトの関係が、少しはクリアになったのではないでしょうか。 

コメント

タイトルとURLをコピーしました