Java | ラッパークラス

Java Java
スポンサーリンク

Javaのラッパークラスの基本

プログラミング初心者がつまずきやすいポイントを、具体例たっぷりでかみ砕いて説明します。キーワードは「基本型をオブジェクトとして扱うためのクラス」。まずは全体像から掴みましょう。


ラッパークラスとは何か

  • 基本型とオブジェクトの違い: intdouble は「ただの値」。IntegerDouble は「値を包んだオブジェクト」で、便利なメソッドが使えます。
  • ペアの関係: 基本型とラッパークラスは一対一。
    • int ↔ Integer
    • double ↔ Double
    • boolean ↔ Boolean
    • char ↔ Character
    • そのほか: long ↔ Long, float ↔ Float, short ↔ Short, byte ↔ Byte
  • なぜ必要?: コレクション(List, Map)はオブジェクトしか入れられないため、基本型を入れる時はラッパークラスが必須。

よく使う基本操作

値を包む(ボクシング)

  • 推奨の作り方:
Integer a = Integer.valueOf(10);
Double b = Double.valueOf(3.14);
Boolean flg = Boolean.valueOf(true);
Java
  • 直接代入(オートボクシング): 後述の「自動変換」により、これでもOK。
Integer a = 10;    // int → Integer に自動変換
Java

値を取り出す(アンボクシング)

  • 明示的に取り出す:
int x = a.intValue();
double y = b.doubleValue();
boolean f = flg.booleanValue();
Java
  • 自動で取り出す(アンボクシング):
int x = a;         // Integer → int に自動変換
Java

オートボクシング/アンボクシングの感覚を掴む例

例1: 計算で混ざっても自動でうまくやってくれる

Integer a = 5;      // オートボクシング(int → Integer)
int b = 7;
int sum = a + b;    // a は自動アンボクシングされて int として計算
System.out.println(sum); // 12
Java

例2: コレクションに入れるときはラッパーが必要

import java.util.*;

List<Integer> nums = new ArrayList<>();
nums.add(10);       // 10 はオートボクシングされて Integer になる
nums.add(20);

int first = nums.get(0); // 取り出すときはアンボクシングされて int
System.out.println(first); // 10
Java

文字列との変換(超よく使う)

文字列 → 数値(パース)

  • 整数に変換:
int n = Integer.parseInt("123");     // "123" → 123
Java
  • 小数に変換:
double d = Double.parseDouble("3.14"); // "3.14" → 3.14
Java
  • 失敗ケースに注意: 数字でない文字が混じると例外が出ます。
int bad = Integer.parseInt("12a"); // NumberFormatException
Java

数値 → 文字列

  • シンプルに変換:
String s1 = String.valueOf(123);     // "123"
String s2 = Integer.toString(123);   // "123"
String s3 = Double.toString(3.14);   // "3.14"
Java

よくある落とし穴とコツ

  • nullに注意: ラッパークラスはオブジェクトなのでnullが入ることがあります。アンボクシング時にnullだとエラー(NullPointerException)。
Integer maybeNull = null;
// int x = maybeNull; // ここで NullPointerException
Java

対策: 取り出し前にnullチェック、またはデフォルト値を使う。

int x = (maybeNull != null) ? maybeNull : 0;
Java
  • 比較はequalsを使う: ラッパー同士の「値比較」は==ではなくequals
Integer a = 128;
Integer b = 128;
System.out.println(a.equals(b)); // true(値が同じ)
System.out.println(a == b);      // false の可能性(参照が違う)
Java

ただし-128~127はキャッシュされるため==trueになることがあり、混乱の元。常にequalsを使うのが安全。

  • 性能への影響: 大量にボクシング/アンボクシングするとオブジェクト生成が増え、メモリ・速度に影響。必要な場面だけ使うのがコツ。

練習問題

練習1: 合計と平均を求める(コレクション+アンボクシング)

import java.util.*;

public class Main {
  public static void main(String[] args) {
    List<Integer> scores = Arrays.asList(80, 90, 75, 100);

    int sum = 0;
    for (Integer s : scores) {
      sum += s; // アンボクシングで int になる
    }

    double avg = (double) sum / scores.size();
    System.out.println("Sum: " + sum + ", Avg: " + avg);
  }
}
Java
  • ねらい: List<Integer>で基本型のように計算できることを体感。

練習2: 入力文字列を安全に数値へ(例外対策)

public class Main {
  public static Integer tryParseInt(String s) {
    try {
      return Integer.valueOf(Integer.parseInt(s));
    } catch (NumberFormatException e) {
      return null; // 失敗したら null を返す
    }
  }

  public static void main(String[] args) {
    Integer n1 = tryParseInt("123");
    Integer n2 = tryParseInt("12a");

    System.out.println(n1); // 123
    System.out.println(n2); // null

    int safe = (n2 != null) ? n2 : 0; // null対策
    System.out.println(safe); // 0
  }
}
Java
  • ねらい: parseIntの失敗とnull対策の定石を知る。

練習3: equalsでの比較を意識する

public class Main {
  public static void main(String[] args) {
    Integer a = 127;
    Integer b = 127;
    Integer c = 128;
    Integer d = 128;

    System.out.println(a == b);        // true(キャッシュの影響)
    System.out.println(c == d);        // false(参照が違う可能性)
    System.out.println(c.equals(d));   // true(値は同じ)
  }
}
Java
  • ねらい: ==equalsの違いを体で覚える。

まとめ

  • 基本型をオブジェクト化するのがラッパークラス。 コレクション利用、文字列変換、メソッド活用が目的。
  • オートボクシング/アンボクシングで自然に書けるが、nullequals比較に注意。
  • まずは「int ↔ Integer」「parseInttoString」「コレクションでの使い方」を押さえれば実務で困りません。
Java
スポンサーリンク
シェアする
@lifehackerをフォローする
スポンサーリンク
タイトルとURLをコピーしました