未来エンジニア養成所Blog

プログラミングを皆に楽しんでもらうための情報をお届けします。

【Java】ラッパークラス Part2

title

前回に引き続きラッパークラスを解説します。 phoeducation.work


ラッパークラスのメソッド

ラッパークラスのコンストラクタを使ってラッパークラスのオブジェクトを作成する以外に、ラッパークラスには基本データ型やString型をラッパークラスのオブジェクトに変換するメソッドが用意されています。

また逆にラッパークラスオブジェクトを基本データ型に変換するメソッドも用意されています。

  • 引数に指定された値をIntegerオブジェクトに変換するvalueOf()メソッド valueOf()メソッド
    ※Characterクラス以外のラッパークラスにもvalueOfメソッドは定義されています。


  • 引数に指定された値をIntegerオブジェクトに変換するparseInt()メソッド parseInt()メソッド
    ※その他各ラッパークラスには、parseShort()、parseLong()、parseFloat()、parseDouble()が用意されています。


  • 引数に指定された値をIntegerオブジェクトに変換するXXXValue()メソッド XXXValue()メソッド
    ※その他各ラッパークラスには、shortValue()、longValue()、floatValue()、doubleValue()が用意されています。


【ラッパークラスのvalueOf()メソッド】

public class WrapperSample3 {
     public static void main(String[] args) {
          Integer obj1 = Integer.valueOf("100");
          Short obj2 = Short.valueOf("200");
          Long obj3 = Long.valueOf("300");
          Float obj4 = Float.valueOf("400");
          Double obj5 = Double.valueOf("500");


          System.out.println(obj1 + obj2 + obj3 + obj4 + obj5);
     }
}


実行結果

1500.0


各ラッパークラスのvalueOf()メソッドはstaticメソッドです。

クラス名.メソッド名として指定をしますので、Integer.valueOf()という形になります。

また引数には対応した基本データ型もしくはString型を取ることができます。


上の例では、引数にString型を指定して、各ラッパークラスオブジェクトを生成しています。

この変換により数値としての性質を保持することができたので、10行目で演算ができることがわかります。


【ラッパークラスのparseXXX()メソッド】

public class WrapperSample4 {
    public static void main(String[] args) {
        Integer obj1 = Integer.parseInt("100");
        Short obj2 = Short.parseShort("200");
        Long obj3 = Long.parseLong("300");
        Float obj4 = Float.parseFloat("400");
        Double obj5 = Double.parseDouble("500");
        System.out.println(obj1 + obj2 + obj3 + obj4 + obj5);


        Integer obj6 = Integer.parseInt("abc");
    }
}


実行結果

1500.0
Exception in thread "main" java.lang.NumberFormatException: For input string: "abc"
    at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
    at java.lang.Integer.parseInt(Integer.java:580)
    at java.lang.Integer.parseInt(Integer.java:615)
    at WrapperSample4.main(WrapperSample4.java:11)


各ラッパークラスのparseXXX()メソッドはstaticメソッドです。

クラス名.メソッド名として指定をしますので、Integer.parseInt()という形になります。

また引数には対応した基本データ型もしくはString型を取ることができます。


上の例では、引数にString型を指定して、各ラッパークラスオブジェクトを生成しています。

この変換により数値としての性質を保持することができたので、8行目で演算ができることがわかります。

また11行目では指定された引数が数値に変換できないので、NumberFormatException例外が発生しています。


【ラッパークラスのXXXValue()メソッド】

public class WrapperSample5 {
    public static void main(String[] args) {
        Integer obj1 = Integer.parseInt("100");
        int i = obj1.intValue();

        Short obj2 = Short.parseShort("200");
        short s = obj2.shortValue();

        Long obj3 = Long.parseLong("300");
        long l = obj3.longValue();

        Float obj4 = Float.parseFloat("400");
        float f = obj4.floatValue();

        Double obj5 = Double.parseDouble("500");
        double d = obj5.doubleValue();

        System.out.println(i + s + l + f + d);
    }
}


実行結果

1500.0


各ラッパークラスのXXXValue()メソッドはインスタンスメソッドです。

オブジェクト名.メソッド名として指定をします。


3、6、9、12、15行目で各ラッパークラスのオブジェクトを作り、7、10、13、16行目でXXXValue()メソッドを使って、基本データ型へ変換しています。

また引数には対応した基本データ型もしくはString型を取ることができます。


上の例では、引数にString型を指定して、各ラッパークラスオブジェクトを生成しています。

この変換により数値としての性質を保持することができたので、18行目で演算ができることがわかります。

もし数値として変換できないような値(例えば"ABC"など)を引数に指定すると、NumberFormatExceptionのエラーが発生します。


ラッパークラスのequals()メソッド

ラッパークラスではObjectクラスのequals()メソッドがオーバーライドされて定義されています。

Objectクラスのequals()メソッドはオブジェクトが同じかどうかを調べるものでしたが、ラッパークラスのequals()メソッドはStringクラスのequals()メソッド同様に、格納されている値が同じかどうかを調べます。

ただし同じラッパークラス同士で、同じ値のみtrueを返します。たとえ値が同じでも、異なるラッパークラス同士ではfalseを返します。


【ラッパークラスのequals()メソッド】

public class WrapperSample6 {
    public static void main(String[] args) {
        Integer in1 = new Integer(123);
        Integer in2 = new Integer("123");

        Short sh1 = new Short("123");
        Short sh2 = new Short("123");

        System.out.println(in1.equals(in2));
        System.out.println(sh1.equals(sh2));
        System.out.println(in1.equals(sh1));

    }
}


実行結果

true
true
false


3行目と4行目では同じ値を持つIntegerオブジェクトを作成しています。

また6行目と7行目では同じ値を持つShortオブジェクトを作成しています。

9行目と10行目は同じクラスの同じ値のオブジェクトなのでtrueを返します。

11行目はShort型のオブジェクトをInteger型と比較しているため、値は同じですが、falseが返されています。

equals()メソッド


autoboxing/unboxing機能

これまでラッパークラスのコンストラクタやメソッドを使って基本データ型をラッパークラス型に変換してきましたが、JDK5.0からこれらの変換を自動で行うautoboxing/unboxing機能が追加されました。


boxing機能は基本データ型をラッパークラスへ、unboxing機能はラッパークラスを基本データ型へ変換します。


ただし、ラッパークラスでないオブジェクトをunboxingしようとするとNullPointerException例外が発生します。

autoboxing/unboxing


autoboxing/unboxing機能の注意事項

  1. autoboxing機能において暗黙の型変換は行われない。またラッパークラス同士の型変換も行われない。
  2. autoboxing機能によってラッパークラスオブジェクトが生成される時、メモリ効率を図るため、次の場合は同じオブジェクトを参照する。
    ・ trueまたはfalseのboolean値
    ・ int型、shot型の-128~127の範囲の整数
    ・ byte型の-128~127の範囲の整数
    ・ \u0000~\u007Fの範囲の文字
  3. equals()メソッドを利用した比較では、Integer型では同じint型を含むIntegerオブジェクトである場合、trueとなる。


【autobxing/unboxing機能1】

public class BoxingSample1 {
    public static void main(String[] args) {
        int i = 100;
        Integer obj = 200;
        int sum = i + obj;
        System.out.println(sum);
    }
}


実行結果

300


3行目でint型の変数iに100を代入しています。4行目で200というint型の値をautoboxing機能によりInteger型に変換して変数objに格納しています。

5行目ではInteger型の変数objをunboxing機能によりint型に変換して、int型同士で演算子をし、int型の変数sumに代入しています。


【autobxing/unboxing機能2】

public class BoxingSample2 {
    public static void main(String[] args) {
        double d1 = 3.14f;  //float型からdouble型への暗黙の型変換
        Float  d2 = 3.14f;  //float型からFloat型へのautoboxing
        Double d3 = d2;     //Float型からDouble型への変換


        long l1 = 10;    //int型からlong型への暗黙の型変換
        Long l2 = l1;    //long型からLong型へのautoboxing
        Float l3 = l2;   //Long型からFloat型への変換

    }
}


コンパイルエラー


3行目では基本データ型のfloat型の値を基本データ型のdouble型に変換しています。

これは暗黙の型変換なので問題はありません。

4行目では基本データ型のfloat型をラッパーラスのFloat型にautoboxingしています。


5行目ではFloat型をDouble型に代入してようとしていますが、ラッパークラス同士の型変換は行われないので、コンパイルエラーになります。

8行目ではint型のリテラルをlong型に変換しています。

これは暗黙の型変換なので問題ありません。

9行目ではlong型をLong型にautoboxingしていますので、問題ありません。

10行目はLong型をFloat型に変換しようとしていますが、異なる型のラッパークラス同士の変換なので、コンパイルエラーになります。


【autobxing/unboxing機能3】

public class BoxingSample3 {
    public static void main(String[] args) {
        Boolean b1 = true;
        Boolean b2 = true;
        System.out.println("b1 == b2 : " + (b1 == b2));

        Integer i1 = 10;
        Integer i2 = 10;
        System.out.println("i1 == i2 : " + (i1 == i2) );
        System.out.println("i1.equals(i2) : " +(i1.equals(i2)) );

        Integer i3 = 128;
        Integer i4 = 128;
        System.out.println("i3 == i4 : " +(i3 == i4) );
        System.out.println("i3.equals(i4) : " +(i3.equals(i4)) );

    }
}


実行結果

b1 == b2 : true
i1 == i2 : true
i1.equals(i2) : true
i3 == i4 : false
i3.equals(i4) : true


3行目と4行目ではBoolean型のオブジェクトを生成しています。

Boolean型では値がtrue同士もしくはfalse同士であれば同じオブジェクトを参照しますので、==演算子による比較はtrueを返します。

7行目と8行目ではint型の10という値をautoboxing機能でInteger型に変換しています。

Integer型の場合-128~127の範囲の値は同じオブジェクトを生成しますので、==演算子の比較はtrueになり、equals()メソッドの値比較でもtrueになります。

12行目と13行目では-128~127の範囲外である128を値としてIntegerオブジェクトを生成しているので、i3とi4は別々のオブジェクトとなります。

したがって==演算子ではfalseを返し、equals()メソッドではtrueを返します。


equals()メソッド


まとめ

  • ラッパークラス
    • 基本データ型の性質をそのまま受け継いだオブジェクト型です。
    • ラッパークラスには、基本データ型に合わせて、Byte、Short、Integer、Long、Character、Float、Double型があります。
    • 基本データ型をラッパークラスオブジェクトにするには、コンストラクタを使う方法とメソッドを使う方法があります。
    • ラッパークラスのequals()メソッドは、Objectクラスのequals()メソッドをオーバーライドして、値が等しいかどうかを判定します。
    • オブジェクト型と基本データ型を変換する際に、autoboxing/unboxing機能が働き、明示的に変換するソースコードを記述しなくてもよいです。


参考図書



独学で挫折しそうになったら、オンラインプログラミングスクール
未来エンジニア養成所Logo



あわせて学習したい

phoeducation.work phoeducation.work