Java | ラッパークラス

Java Java
スポンサーリンク

ラッパークラスを初心者向けにやさしく解説(例題つき)

まず結論:ラッパークラスは「基本型(int や double など)」を「オブジェクト」として扱えるようにするためのクラスです。オブジェクトにするとメソッドが使えたり、コレクション(ArrayList など)に格納できたりします。

以降は初心者向けに「なぜ必要か」「どう使うか」「よく使う例」「落とし穴」をコード例付きでわかりやすく説明します。


1. 基本イメージ(超かんたん)

  • Java の基本型(primitive): int, double, char, boolean など。値そのものを扱う(メソッドを持たない)。
  • ラッパークラス: Integer, Double, Character, Boolean など。オブジェクト(メソッドを持てる)。

イメージ:int は「生のリンゴ1個」、Integer は「リンゴを包んだ箱(ラベルや説明が付けられる)」みたいな感じ。


2. ラッパークラスを使う必要がある場面

  • Java のコレクション(ArrayList など)はオブジェクトしか入れられない → int は直接入れられないので Integer を使う
    例:ArrayList<Integer> list = new ArrayList<>();
  • 基本型にない「便利なメソッド」を使いたいとき(文字列変換、別の型への変換など)
  • ジェネリクスやリフレクションなど、オブジェクトが前提のAPIを使うとき

3. ラッパークラスの作り方(オブジェクト化)

推奨される(現代的な)書き方:valueOf を使う

Integer i1 = Integer.valueOf(16);   // 推奨
Double d1 = Double.valueOf(3.14);
Character c1 = Character.valueOf('A');
Java

昔の(非推奨)書き方:new

Integer iOld = new Integer(16); // 非推奨(避ける)
Java

ただし実際にはもっと簡単に書けます(次の「オートボクシング」で説明)。


4. オートボクシング(Autoboxing)とアンボクシング(Unboxing)

Java は自動で変換してくれます。

  • オートボクシング:基本型 → ラッパーへの自動変換
    Integer i = 16; が自動で Integer.valueOf(16) に変換される。
  • アンボクシング:ラッパー → 基本型への自動変換
    int n = i;i.intValue() のように扱われる。

例:

Integer boxed = 10;  // オートボクシング(自動で Integer.valueOf(10))
int primitive = boxed; // アンボクシング(自動で boxed.intValue())
Java

5. ラッパークラスのよく使うメソッド(例:Integer)

  • Integer.parseInt(String s) : 文字列を int に変換
    例:int n = Integer.parseInt("123");
  • Integer.valueOf(String s) : 文字列を Integer に変換(内部でキャッシュあり)
    例:Integer i = Integer.valueOf("123");
  • intValue(), doubleValue() 等:ラッパーから基本型を取り出す(手動の場合)
Integer i = Integer.valueOf(16);
int n = i.intValue();       // 手動で取り出す方法
double d = i.doubleValue(); // double に変換して取り出す
Java

6. 具体的な例題(実行イメージ付き).

例題 A — ArrayList に int を入れて合計を出す

import java.util.ArrayList;

public class ExampleA {
    public static void main(String[] args) {
        ArrayList<Integer> list = new ArrayList<>();
        list.add(10); // オートボクシングで Integer に
        list.add(20);
        list.add(30);

        int sum = 0;
        for (Integer x : list) {
            sum += x; // アンボクシングして int に
        }
        System.out.println("合計: " + sum); // 出力: 合計: 60
    }
}
Java

解説:list.add(10) は内部で Integer.valueOf(10) され、sum += x では x が自動で int に変換されます。


例題 B — 文字列を数値に変換して計算

public class ExampleB {
    public static void main(String[] args) {
        String a = "15";
        String b = "7";

        int ai = Integer.parseInt(a);
        int bi = Integer.parseInt(b);

        int product = ai * bi;
        System.out.println("掛け算: " + product); // 出力: 掛け算: 105
    }
}
Java

解説:Integer.parseInt は例外(NumberFormatException)を投げる場合があるので、実運用では入力確認や try-catch を使います。


7. よくある落とし穴(初心者がハマりやすいポイント)

1. null とアンボクシング

Integer x = null;
int n = x; // ここで NullPointerException(NPE)が発生する
Java

→ ラッパークラスに null が入っているとアンボクシングで NPE になるので注意。

2. == と equals の違い(参照と値の比較)

  • == は参照(オブジェクトの場所)を比較する。
  • equals() は値(内容)を比較する(クラスによる)。
Integer a = Integer.valueOf(100);
Integer b = Integer.valueOf(100);
System.out.println(a == b);        // true(-128〜127 はキャッシュされるため)
System.out.println(a.equals(b));   // true(値は同じ)

Integer c = Integer.valueOf(1000);
Integer d = Integer.valueOf(1000);
System.out.println(c == d);        // false(キャッシュ範囲外だと別オブジェクト)
System.out.println(c.equals(d));   // true
Java

→ 数値の比較は equals() か、アンボクシングして int 同士で == を使うのが安全。

3. パフォーマンス(頻繁にオブジェクト化するとコストがかかる)

  • 大量のループで何度もオートボクシング/アンボクシングするとオブジェクト生成が増え、遅くなる場合がある。
  • 可能なら基本型を使う(配列など)か、処理方法を考慮する。

8. 実践でよく使うテクニック・ケース

文字列 → 数値(ユーザー入力など)

try {
    int n = Integer.parseInt(inputString);
} catch (NumberFormatException e) {
    // 入力が数値でない場合の処理
}
Java

null 安全に扱いたい場合

Integer maybe = getSomeInteger();
int safe = (maybe == null) ? 0 : maybe; // null のときはデフォルト値
Java

9. 練習問題(初心者向け・解答付き)

問1

ArrayList<Integer> に 1〜5 を追加し、平均(小数)を出力するプログラムを書いてください。

解答例

import java.util.ArrayList;

public class Q1 {
    public static void main(String[] args) {
        ArrayList<Integer> list = new ArrayList<>();
        for (int i = 1; i <= 5; i++) list.add(i);

        int sum = 0;
        for (Integer x : list) sum += x;
        double avg = (double) sum / list.size();
        System.out.println("平均: " + avg); // 平均: 3.0
    }
}
Java

解説:合計を int で取り、平均計算時に (double) キャストして小数を得る。


問2

文字列 "202"int に変換し、5 を足して表示するコードを書いてください。例外処理も入れてください。

解答例

public class Q2 {
    public static void main(String[] args) {
        String s = "202";
        try {
            int n = Integer.parseInt(s);
            System.out.println(n + 5); // 207
        } catch (NumberFormatException e) {
            System.out.println("数値に変換できません: " + s);
        }
    }
}
Java

問3

次のコードの出力は何でしょう? 理由も答えてください。

Integer a = Integer.valueOf(127);
Integer b = 127;
System.out.println(a == b);
Java

解答
出力は true
理由:Integer は -128〜127 の範囲をキャッシュするため、同じ値だと同一のオブジェクト参照になるので ==true になる。


問4

次のコードはエラーになります。なぜか説明してください。

Integer x = null;
int y = x;
Java

解答
xnull のためアンボクシングしようとすると NullPointerException が発生する。


問5(応用)

ArrayList<String> に入った数字(例:”10″,”20″,”30″)を全部足して合計を int で出すプログラムを書いてください。文字列が数値でない場合は無視します。

解答例

import java.util.ArrayList;

public class Q5 {
    public static void main(String[] args) {
        ArrayList<String> arr = new ArrayList<>();
        arr.add("10"); arr.add("abc"); arr.add("20"); arr.add("30");

        int sum = 0;
        for (String s : arr) {
            try {
                sum += Integer.parseInt(s);
            } catch (NumberFormatException e) {
                // 数字でない場合は無視
            }
        }
        System.out.println("合計: " + sum); // 合計: 60
    }
}
Java

10. まとめ

  • ラッパークラス = 基本型をオブジェクト化したもの(intInteger 等)。
  • コレクションやメソッド操作のために必要。
  • valueOf/オートボクシングで簡単に使える。
  • null== の扱いに注意。

Java
スポンサーリンク
シェアする
@lifehackerをフォローする
スポンサーリンク
タイトルとURLをコピーしました