ラッパークラスを初心者向けにやさしく解説(例題つき)
まず結論:ラッパークラスは「基本型(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())
Java5. ラッパークラスのよく使うメソッド(例: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 に変換して取り出す
Java6. 具体的な例題(実行イメージ付き).
例題 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) {
// 入力が数値でない場合の処理
}
Javanull 安全に扱いたい場合
Integer maybe = getSomeInteger();
int safe = (maybe == null) ? 0 : maybe; // null のときはデフォルト値
Java9. 練習問題(初心者向け・解答付き)
問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解答x が null のためアンボクシングしようとすると 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
}
}
Java10. まとめ
- ラッパークラス = 基本型をオブジェクト化したもの(
int→Integer等)。 - コレクションやメソッド操作のために必要。
valueOf/オートボクシングで簡単に使える。null・==の扱いに注意。
