Javaのラッパークラスの基本
プログラミング初心者がつまずきやすいポイントを、具体例たっぷりでかみ砕いて説明します。キーワードは「基本型をオブジェクトとして扱うためのクラス」。まずは全体像から掴みましょう。
ラッパークラスとは何か
- 基本型とオブジェクトの違い:
intやdoubleは「ただの値」。IntegerやDoubleは「値を包んだオブジェクト」で、便利なメソッドが使えます。 - ペアの関係: 基本型とラッパークラスは一対一。
- 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の違いを体で覚える。
まとめ
- 基本型をオブジェクト化するのがラッパークラス。 コレクション利用、文字列変換、メソッド活用が目的。
- オートボクシング/アンボクシングで自然に書けるが、nullとequals比較に注意。
- まずは「
int ↔ Integer」「parseIntとtoString」「コレクションでの使い方」を押さえれば実務で困りません。
