はじめに
未経験からJavaを学んでいると、
- 「型変換」と
- 「オートボクシング」
がごっちゃになりがちです。
この記事では オートボクシング/アンボクシングだけに絞って
まとめたいと思います。
結論
✅ オートボクシング = プリミティブ → オブジェクト
✅ アンボクシング = オブジェクト → プリミティブ
✅ 数値の「大きさ」は変わらない(ここ重要)
オートボクシングとは(int → Integer)
オートボクシングとは、
👉 プリミティブ型をラッパークラスに自動変換する仕組みです。
例①(基本)
int x = 10;
Integer y = x; // 自動変換(オートボクシング)
何が起きているか?
-
int(ただの数値) - →
Integer(オブジェクト)
に変わっています。
例②(メソッドでよく起きる)
List<Integer> list = new ArrayList<>();
list.add(10); // ← ここでオートボクシング
本来 add() は Integer を受け取りますが、
-
10(int)を渡すと - 自動で
Integerに変換される
👉 これがオートボクシング
💡 ポイント
- 数値の値は変わらない
- 「型の種類」が変わるだけ
- Javaが自動でやってくれる
アンボクシングとは(Integer → int)
アンボクシングは逆です。
👉 ラッパークラスをプリミティブ型に戻すこと
例①(基本)
Integer x = 10;
int y = x; // 自動変換(アンボクシング)
例②(計算時に自動で起きる)
Integer a = 10;
Integer b = 20;
int sum = a + b; // ← 内部でアンボクシングされる
このとき内部では:
-
Integer→intに変換されてから - 計算されている
👉 これがアンボクシング
💡 ポイント
- 計算・比較のときによく発生する
- 意識しなくても自動で行われる
⚠️ 初心者がハマるポイント①:null問題
これはめちゃくちゃ重要です。
Integer x = null;
int y = x; // ❌ エラー(NullPointerException)
なぜ?
-
nullは「中身がない」 - それを
intに変換しようとして失敗
👉 アンボクシング時にクラッシュします
✔ 対策
if (x != null) {
int y = x;
}
⚠️ 初心者がハマるポイント②:== 比較
Integer a = 100;
Integer b = 100;
System.out.println(a == b); // true
- 100 はキャッシュ範囲(-128〜127)
- Javaが同じ Integer オブジェクトを使い回す
でも…
Integer a = 200;
Integer b = 200;
System.out.println(a == b); // false
なぜ?
- 200 はキャッシュ範囲外
- 毎回 new Integer(200) みたいに新しく作られる
-
Integerはオブジェクト -
==は「中身」ではなく「参照」を比較
// 100の場合
a ─┐
├── [Integer(100)]
b ─┘
// 200の場合
a ──> [Integer(200)]
b ──> [Integer(200)] ← 別物
✔ 正しい比較方法
a.equals(b);
イメージで理解する
📦 オートボクシング
-
int= 中身だけ -
Integer= 箱に入った中身
👉 「箱に入れる」イメージ
📦 アンボクシング
-
Integer→ 箱から取り出す
👉 「中身だけ使う」イメージ
まとめ
| 種類 | 内容 | 自動? |
|---|---|---|
| オートボクシング | int → Integer | ✅ |
| アンボクシング | Integer → int | ✅ |
🌟 最後に(大事)
オートボクシングは便利ですが、
- nullで落ちる
- 比較でバグる
など、「裏で何が起きているか」を理解しておくことで原因がわかり未然に防ぐことができると思いました。
🔹 オートボクシング = 箱に入れる
🔹 アンボクシング = 箱から出す