6日でできる 新Java入門|基本データ型ラッパークラス

数値をただ持つだけでなく、クラスとして扱えるようになると、Javaの世界はさらに広がる。ラッパークラスを学んで、基本型を実戦レベルへ進化させよう

Javaには int や double などの基本データ型があります。これらはとても軽くて扱いやすく、計算にも向いています。でも、Javaのクラスの世界に入っていくと、基本データ型のままでは扱いにくい場面が出てきます。たとえば、ArrayList のようなコレクションに入れたいときや、クラスが持つメソッドを使って文字列との変換を行いたいときです。そんなときに登場するのが ラッパークラス です。

ドラゴンボールの世界でたとえるなら、基本データ型は まだ変身していないサイヤ人 のような存在です。すばやく動けて、基本の力は十分にあります。でも、クラスの世界で必要になる特別な技や仕組みを使うには、そのままでは足りないことがあります。そこで、サイヤ人がさらに力を引き出して スーパーサイヤ人 へ変身するように、基本データ型を クラス型として扱える姿 にしたものがラッパークラスです。

この記事では、基本データ型とラッパークラスの対応関係、ボクシングとアンボクシング、文字列との相互変換、オートボクシングとオートアンボクシング、ArrayList での利用、さらに変換エラーの注意点まで、順番にしっかり見ていきます。Lesson16_1.java から Lesson16_7.java の例を通して、基本型がクラスの力を得たとき、Javaで何ができるようになるのかを丁寧に整理していきます。

ラッパークラスとは何か

ラッパークラスとは、基本データ型を クラスとして扱えるようにしたもの です。基本データ型はとても便利ですが、クラスではありません。そのため、クラス型が必要な場面ではそのまま使えないことがあります。そこで、基本型を包み込んで、クラスとして扱える形にしたのがラッパークラスです。

ドラゴンボール風にいえば、これは サイヤ人がスーパーサイヤ人へ変身するようなもの です。元の力はそのままですが、クラスの世界で使える特別な技や仕組みが加わります。

基本データ型とラッパークラスの対応

基本データ型ラッパークラス名
byteByte
shortShort
intInteger
longLong
floatFloat
doubleDouble
booleanBoolean
charCharacter

この表はとても大切です。たとえば int のラッパークラスは Integer、double のラッパークラスは Double です。名前は似ていますが、先頭が大文字になっていて、クラスとして使われます。

なぜラッパークラスが必要なのか

基本データ型だけでも、計算や代入は十分できます。それでもラッパークラスが必要になる理由は、Javaが クラスを前提にした仕組み をたくさん持っているからです。

ラッパークラスが役立つ場面

場面なぜ必要か
コレクションで扱うArrayList などは基本型をそのまま入れられない
型変換を行うparseInt や toString などの便利なメソッドが使える
オブジェクトとして扱うクラス型が必要な場面に対応できる

ドラゴンボール風にたとえるなら、基本型のままだと素早い通常戦闘はできても、特別な訓練施設に入ったり、上位技を使ったりするには変身が必要になる、という感覚です。

ボクシングとは何か

基本データ型の値を、ラッパークラスのオブジェクトに包むことを ボクシング と呼びます。これは 基本型からクラス型への変換 です。

ボクシングの基本例

ここでは、修行ポイントをオブジェクト化する形で見てみます。

ファイル名:Lesson16_1.java

public class Lesson16_1 {
    public static void main(String[] args) {
        int power = 100;
        Integer powerObj = Integer.valueOf(power);  // ボクシング

        System.out.println("オブジェクト化された戦闘力: " + powerObj);
    }
}

実行結果

オブジェクト化された戦闘力: 100

このプログラムでは、int 型の power を Integer.valueOf(power) で Integer型へ包んでいます。これがボクシングです。

ボクシングの流れ

段階内容
1int 型の値を用意する
2Integer.valueOf() を使う
3Integer型のオブジェクトとして扱えるようになる

ドラゴンボール風に言えば、通常のサイヤ人の力を、スーパーサイヤ人の姿に変換してクラスの世界で使えるようにする流れです。

アンボクシングとは何か

ラッパークラスのオブジェクトから、基本データ型の値を取り出すことを アンボクシング と呼びます。これは クラス型から基本型への変換 です。

アンボクシングの基本例

ファイル名:Lesson16_2.java

public class Lesson16_2 {
    public static void main(String[] args) {
        Integer energyObj = Integer.valueOf(200);
        int energy = energyObj.intValue();  // アンボクシング

        System.out.println("基本型へ戻した気力: " + energy);
    }
}

実行結果

基本型へ戻した気力: 200

このプログラムでは、Integer 型の energyObj から int 型の energy として取り出しています。intValue() がそのためのメソッドです。

アンボクシングの流れ

段階内容
1Integer 型のオブジェクトを用意する
2intValue() を使って中身を取り出す
3int 型として使えるようになる

これは、スーパーサイヤ人状態で持っていた力を、通常の基本型として取り出して使うようなイメージです。

文字列から数値へ変換する parseXXX

ラッパークラスの大きな強みのひとつが、文字列との変換です。入力データは文字列で受け取ることが多いので、それを数値に変えられるのはとても重要です。文字列から数値へ変換するときは parseXXX() メソッドを使います。

主な parseXXX メソッド

メソッド名機能
Byte.parseByte(String s)文字列を byte 型へ変換
Short.parseShort(String s)文字列を short 型へ変換
Integer.parseInt(String s)文字列を int 型へ変換
Long.parseLong(String s)文字列を long 型へ変換
Float.parseFloat(String s)文字列を float 型へ変換
Double.parseDouble(String s)文字列を double 型へ変換
Boolean.parseBoolean(String s)文字列を boolean 型へ変換

文字列から数値へ変換する例

ファイル名:Lesson16_3.java

public class Lesson16_3 {
    public static void main(String[] args) {
        String s1 = "123";
        int trainingCount = Integer.parseInt(s1);

        String s2 = "3.14";
        double gravityLevel = Double.parseDouble(s2);

        System.out.println("修行回数 = " + trainingCount);
        System.out.println("重力倍率 = " + gravityLevel);
    }
}

実行結果

修行回数 = 123
重力倍率 = 3.14

このプログラムでは、文字列 "123" を int に、文字列 "3.14" を double に変換しています。

ここで見たいこと

変数元の型変換後
s1Stringint
s2Stringdouble

文字列のままでは計算できませんが、数値に変換すれば計算や比較に使えるようになります。

数値を文字列へ変換する toString

逆に、数値を文字列へ変えたいときもあります。表示用にまとめたり、他の文字列とつなげたりしたい場面です。そのときに使うのが toString() や String.valueOf() です。

数値から文字列へ変換する例

ファイル名:Lesson16_4.java

public class Lesson16_4 {
    public static void main(String[] args) {
        int power = 500;
        String s1 = Integer.toString(power);

        double rate = 2.718;
        String s2 = Double.toString(rate);

        System.out.println("s1 = " + s1);
        System.out.println("s2 = " + s2);
    }
}

実行結果

s1 = 500
s2 = 2.718

このプログラムでは、int と double をそれぞれ String に変換しています。

数値 → 文字列変換の意味

元の型変換方法結果
intInteger.toString()String
doubleDouble.toString()String

これで数値も文字列操作の世界へ持ち込めるようになります。

オートボクシングとオートアンボクシング

Java5以降では、ボクシングとアンボクシングを自分で細かく書かなくても、自動で変換してくれる仕組みがあります。これが オートボクシング と オートアンボクシング です。

ドラゴンボール風に言えば、サイヤ人が必要に応じて自然にスーパーサイヤ人へ変わったり、また戻ったりするような感覚です。いちいち変身の儀式を書かなくても、Javaが裏でやってくれます。

オートボクシングとオートアンボクシングの例

ファイル名:Lesson16_5.java

public class Lesson16_5 {
    public static void main(String[] args) {
        Integer scoreObj = 42;     // オートボクシング
        int score = scoreObj + 10; // オートアンボクシング

        System.out.println("score = " + score);
    }
}

実行結果

score = 52

このプログラムでは、42 をそのまま Integer に代入していますが、Javaが自動的に Integer.valueOf(42) のような処理をしてくれます。また、scoreObj + 10 の計算では、自動的に int として扱えるように変換されています。

自動変換のイメージ

書き方Javaが内部でしていること
Integer scoreObj = 42;int → Integer
int score = scoreObj + 10;Integer → int

便利ですが、自動変換が起きていることを理解しておくのは大切です。

ArrayList でラッパークラスを使う

コレクションでは基本型をそのまま入れられないため、ラッパークラスが必要になります。これはラッパークラスが活躍する代表的な場面です。

ファイル名:Lesson16_6.java

import java.util.ArrayList;

public class Lesson16_6 {
    public static void main(String[] args) {
        ArrayList<Integer> list = new ArrayList<>();

        list.add(10);
        list.add(20);

        int value = list.get(0);
        System.out.println("リストの1番目の修行値: " + value);
    }
}

実行結果

リストの1番目の修行値: 10

このプログラムでは、ArrayList を使っています。ここに int を直接 add しているように見えますが、実際にはオートボクシングで Integer に変換されています。get(0) の結果を int に入れるときには、オートアンボクシングが働いています。

ここで見たいこと

場面変換
list.add(10)int → Integer
int value = list.get(0)Integer → int

つまり、コレクションの世界では ラッパークラスが橋渡し役 になっています。

変換できない文字列を扱うときの注意

parseInt などは便利ですが、数字として読めない文字列を変換しようとするとエラーになります。たとえば abc を int にしようとしても無理です。そこで注意が必要です。

ファイル名:Lesson16_7.java

public class Lesson16_7 {
    public static void main(String[] args) {
        try {
            int value = Integer.parseInt("abc");
            System.out.println(value);
        } catch (NumberFormatException e) {
            System.out.println("変換エラー: " + e.getMessage());
        }
    }
}

実行結果

変換エラー: For input string: "abc"

このプログラムでは、Integer.parseInt("abc") を実行していますが、abc は整数として変換できないため、NumberFormatException が発生します。それを catch で受けて、エラーメッセージを表示しています。

注意点の整理

状況結果
数字らしい文字列正しく変換できる
数字にできない文字列エラーになる
対応方法try-catch で処理する

これは、入力値を扱うときにとても大事な考え方です。

ラッパークラスの全体像を図で整理

ラッパークラスは、基本型とクラス型の間を行き来したり、文字列との変換を行ったりする中心的な役割を持っています。

下図は、中央に ラッパークラス を置き、その左に 基本データ型、右に 文字列、下に コレクション を配置した構図です。基本型とはボクシングとアンボクシング、文字列とは parseXXX と toString、コレクションとは ArrayList のようなつながりを示しています。

↓クリックすると拡大表示されます。

この図が示していること

この図は、ラッパークラスが 基本データ型、文字列、コレクション の間をつなぐ役割を持っていることを示しています。単なるクラスではなく、相互変換の中心にある存在だと分かります。

この図から分かること

この図を見ると、ラッパークラスがなぜ必要なのかが整理しやすくなります。基本型をクラスの世界へ持ち込み、文字列との変換もこなし、コレクションでも活躍するという、かなり重要な橋渡し役であることが見えてきます。

ボクシングとアンボクシングの流れを図で整理

ボクシングとアンボクシングは言葉だけだと少し抽象的なので、図にすると理解しやすくなります。

この図は、左に int のような基本型、中央に Integer のようなラッパークラス、右に ArrayList や計算式を配置し、基本型がラッパークラスへ包まれ、必要に応じて再び基本型へ戻る流れを示したものです。

↓クリックすると拡大表示されます。

この図が示していること

この図は、基本型の値がラッパークラスに包まれ、必要な場面でまた基本型として取り出される流れを示しています。ボクシングとアンボクシングが反対方向の変換であることが見て分かります。

この図から分かること

この図を見ると、ラッパークラスはただ値を持つだけでなく、基本型とクラス型の世界を行き来するための中間的な役割を持っていることが分かります。自動変換が便利でも、裏側の流れを理解しておく意味が見えやすくなります。

ラッパークラスを理解すると、基本型の世界とクラスの世界がつながる

基本データ型は、Javaの土台としてとても大切です。でも、Javaがクラス中心の言語である以上、基本型だけでは足りない場面も出てきます。そこでラッパークラスが登場し、基本型をクラスとして扱えるようにしてくれます。ボクシング、アンボクシング、文字列との相互変換、コレクションでの利用まで理解できると、Javaの世界がかなりつながって見えてきます。

ドラゴンボールの世界で言えば、サイヤ人がスーパーサイヤ人へ変身することで、今まで使えなかった力や技を引き出せるようになる感覚に近いです。ラッパークラスは、基本データ型に クラスとしての力 を与える、とても重要な仕組みです。