検索

キーワード


【Java】intとInteger?何が違う?『ラッパークラス』の疑問を解決!!

  • 公開日:2020-09-17 12:13:57
  • 最終更新日:2021-01-25 11:12:32
【Java】intとInteger?何が違う?『ラッパークラス』の疑問を解決!!

こんにちは。新人エンジニアのサトウです。

システムエンジニアとして駆け出したばかりですが、

初心者なりの視点でわかりやすい記事を心がけていますので参考になればうれしいです。


プログラム初心者✅にも、プログラムに興味がある人✨も、

短い時間で簡単にできますのでぜひこの記事を読んで試してみてください!

ラッパークラス(Wrapper class )

Javaのデータ操作

プログラムでやり取りする情報を値(データ)と呼びます。

そのデータを一時的に記憶するために用意されているものが変数です。

Javaでは変数の種類や範囲が決められており、この形式を型と呼びます。

型は基本データ型(別名:値型/プリミティブ型)クラス型(別名:参照型/リファレンス型)

二つに大きく分けることができます。


※変数についての詳細は以下の記事で紹介しています。

参考記事リンク:【Java】変数、定数の宣言と変数の列挙型、代入、型変換、型推論の使い方


基本データ型とクラス型

基本データ型はJavaに元から定義されています。数値や文字などの値を格納することができます。

演算子と組み合わせる場合であれば基本データ型を使えば十分です。

ですが、基本データ型のままでは加工処理機能(メソッドなど)を有してないという点があります。


一方でクラス型は直接値を格納せずに参照先(値が格納されている場所の情報)を保持しています。

インスタンス化することができ、メソッド等オブジェクトを呼び出して変数を操作することができます。


この基本データ型のままでは足りないところや不便なところを補ったものが

今回紹介するラッパークラスになります。


データ型について詳しくは以下の記事で紹介しています。

参考記事リンク:【Java】データ型(基本データ型とクラス型)についての紹介!


ラッパークラス(Wrapper class )

ラッパークラスとは、基本データ型をオブジェクトとして扱えるように

クラスとして定義したものです。

int型などの基本データ型に対応するラッパークラスが用意されています。

基本データ型の値をオブジェクト内に保持する事ができ、

値を加工するための処理(メソッド)も用意されています。

基本クラス型に対応するラッパークラスの一覧


ラッパークラスの初期化

ラッパークラスはNew演算子を使って以下のように初期化することができます。

Boolean b_W = new Boolean(true);//論理型
Integer i_W = new Integer(100);//整数型
Double  d_W = new Double(1.00);//浮動小数点型

引数にはラッパークラスに対応する基本データ型を指定できるほかに、

対応する基本データ型の値を表せるString文字列を指定することができます。

Boolean b_W = new Boolean("true");//論理型
Integer i_W = new Integer("100");//整数型
Double  d_W = new Double("1.00");//浮動小数点型

コンストラクタによる初期化(インスタンス化)は非推奨となっています。

ラッパークラスのインスタンス化においては下記で紹介するvalueOf メソッドが推奨されています。


また下記で紹介するオートボクシング機能の実装によって

Java5.0では値のみをそのまま記述した初期化ができるようになりました

Boolean b_W = true;//論理型
Integer i_W = 100;//整数型
Double  d_W = 1.00;//浮動小数点型

該当目次では詳しく紹介します。【見出しジャンプ:オートボクシング】


基本データ型とラッパークラスの変換

Java5.0以降ではラッパークラスの変換において下記で紹介するオートボクシング機能が実装されました。

オートボクシングによって実装者は特に意識することなく、

基本データ型⇒ラッパークラスへの変換を行うことができるようになっています。

基本データ型からラッパークラスオブジェクトへ変換

今回はラッパークラスの変換を明示的に記述するとどうなるかを最初にご紹介します。

- オブジェクト生成時に代入

ラッパークラスオブジェクトを生成したときに対応する基本データ型の値を引数に指定することで、

基本データ型⇒ラッパークラスの変換をすることができます。

boolean b =true;
Boolean b_W = new Boolean(b);//論理型

int i =100;
Integer i_W = new Integer(i);//整数型

double d =1.00;
Double  d_W = new Double(d);//浮動小数点型


- valueOfメソッド

ラッパークラスにはvalueOfメソッドが実装してあり、このメソッドを使用して変換することも可能です。

対応する基本データ型の値を引数に指定します。


サンプルコード

public class Test {
	public static void main(String args[]) {

		boolean b = true;
		Boolean b_Wv = Boolean.valueOf(b);//論理型

		int i = 100;
		Integer i_Wv = Integer.valueOf(i);//整数型

		double d = 1.00;
		Double d_Wv = Double.valueOf(d);//浮動小数点型

		System.out.println(b_Wv);
		System.out.println(i_Wv);
		System.out.println(d_Wv);
	}
}

出力結果

true
100
1.0


◆引数にString文字列を指定

またvalueOfメソッドは引数にString文字列を指定することができます。

指定された文字列によって表される値を対応する基本データ型の値で返します。

基本データ型に扱えない値が入った場合は実行時にエラーが生じます。


サンプルコード

public class Test {
	public static void main(String args[]) {

		Boolean b_Wv = Boolean.valueOf("true");//論理型
		Integer i_Wv = Integer.valueOf("100");//整数型
		Double  d_Wv = Double.valueOf("1.00");//浮動小数点型

		System.out.println(b_Wv);
		System.out.println(i_Wv);
    	System.out.println(d_Wv);
	}
}

出力結果

true
100
1.0


ラッパークラスオブジェクトから基本データ型へ変換

ラッパークラスオブジェクトから基本データ型への変換の明示的な記述も紹介します。

- ○○Valueメソッド

ラッパークラスオブジェクトから基本データ型への変換は○○Valueメソッドを使います。

○○には基本データ型の名前が入ります。(ex. byteValue/floatValue)

サンプルコード

public class Test {
	public static void main(String args[]) {

		Boolean b_W = new Boolean(true);//論理型
		boolean b =b_W.booleanValue();

		Integer i_W = new Integer(100);//整数型
		int i =  i_W.intValue();

		Double d_W = new Double(1.00);//浮動小数点型
		double d =d_W.doubleValue();

		System.out.println(b);
		System.out.println(i);
        System.out.println(d);
	}
}

出力結果

true
100
1.0


オートボクシング

Java5.0からラッパークラスオブジェクトと基本データ型の変換が自動的に行われる機能が実装されました。

その機能がオートボクシングです。

この機能によって特に意識することなく

基本データ型とラッパーオブジェクトを相互に変換することができるようになりました!


- Java5.0以降に可能になった初期化

基本データ型とラッパークラスオブジェクトが自動変換できるようになったおかげで、

より簡単なコードでラッパークラスオブジェクトの生成ができるようになりました。


Java5.0以前はvalueOfメソッドを使用したオブジェクト生成が主流でしたが、

以下のように値をそのまま代入する記述で簡単にオブジェクト生成ができます。

Boolean b_W = true;//論理型
Integer i_W = 100;//整数型
Double  d_W = 1.00;//浮動小数点型

※以降のサンプルコードはこの初期化を使っています。


- ボクシング

基本データ型からラッパークラスへの自動変換をボクシング(そのまま「オートボクシング」とも)と言います。

変換メソッドを用いることなく、基本データ型の変数やリテラル(データそのもの)を

ラッパークラスの変数に直接代入する事ができるようになっています。

サンプルコード

public class Test {
	public static void main(String args[]) {

		boolean b = true;
		Boolean b_Wv = b;//論理型

		int i = 100;
		Integer i_Wv = i;//整数型

		double d = 1.00;
		Double d_Wv = d;//浮動小数点型

		System.out.println(b_Wv);
		System.out.println(i_Wv);
		System.out.println(d_Wv);
	}
}

出力結果

true
100
1.0


- アンボクシング

ラッパークラスから基本データ型への自動変換をアンボクシングと言います。

ボクシングと同様にラッパークラスのオブジェクトを、

基本データ型の変数に直接代入する事ができるようになっています。


サンプルコード

public class Test {
	public static void main(String args[]) {

		Boolean b_W = true;//論理型
		boolean b =b_W;

		Integer i_W = 100;//整数型
		int i =  i_W;

		Double d_W = 1.00;//浮動小数点型
		double d =d_W;

		System.out.println(b);
		System.out.println(i);
		System.out.println(d);
	}
}

出力結果

true
100
1.00


◆アンボクシングの例外

ラッパークラスオブジェクトにnullが代入されている際、

アンボクシングを行うと基本データ型にはnullを代入することができないので例外が発生してしまいます。


例外サンプルコード

public class Test {
	public static void main(String args[]) {

		Boolean b_W = null;//論理型
		boolean b =b_W;
		Integer i_W = null;//整数型
		int i =  i_W;
		Double d_W = null;//浮動小数点型
		double d =d_W;

		System.out.println(b);
		System.out.println(i);
		System.out.println(d);
	}
}

出力結果

Exception in thread "main" java.lang.NullPointerException


【おまけ】文字列・データ型間の変換方法

今回紹介したvalueOfメソッドは文字列・データ型間の変換にも使用されます。


String型(文字列)とデータ型の変換はメソッドの引数やデータ比較、データベースへの登録などにおいて、

お互いの整合性を合わせる場合などに必要となります。


以下のようなメソッドがあります。

 valueOfメソッド文字列からデータ型、データ型から文字列の両方で使うことができます。

 parse○○メソッド文字列からデータ型へ変換する際に使います。○○にはデータ型の名前が入ります。

 toStringメソッド  :データ型から文字列へ変換する際に使います。


詳しくは以下の記事で紹介してるので是非参考にしましょう!

参考記事リンク:【Java】 文字列・データ型間の変換方法


ラッパークラスオブジェクトの比較

ラッパークラスオブジェクトの比較は、Stingクラスの比較と同じように記述の仕方を注意しなければなりません。

クラス型は値そのものではなく参照先(値が格納されている場所の情報)を保持しています。

プログラム内部の処理で異なる場所に格納されることがあるので

値は同じでも==演算子を使用した場合、結果が異なってしまうことがあります。


ラッパークラスオブジェクトが生成(インスタンス化)されるたびに新しい参照先が生成されるため、

同じ値を持った同じ型のオブジェクトでも参照先が異なっていれば==演算子では等しいと判断されません。


そこで、ラッパークラスでの値の比較にはequalsメソッドを使いましょう!

equalsメソッドでは、オブジェクトが保持している値を比較しますので、

参照先(値が格納されている場所の情報)が異なっていても、保持している値が同一であればtrueを返します。


サンプルコード

public class Test {
	public static void main(String args[]) {

		Boolean b_W  = true;//論理型
		Boolean b_W1 = true;

		Integer i_W  = 100;//整数型
		Integer i_W1 = 128;

		Double d_W  = 1.00;//浮動小数点型
		Double d_W1 = 1.28;

		System.out.println(b_W.equals(b_W1));
		System.out.println(i_W.equals(i_W1));
		System.out.println(d_W.equals(d_W1));
	}
}

出力結果

true
false
false


同じ参照型のデータであるStringオブジェクトの比較に関しては以下の記事で紹介しているので参考にどうぞ!

参考記事リンク:【Java】Stringクラスの文字列比較・判定・検索



【著者】

新人SE・サトウ

読者を始め私自身も知りたい!と思うような知って得するプログラミング知識やIT情報を日々発信中です。
筆者の憧れの人物は、コリン・ファースさん、渡部篤郎さん。
教養のあるカッコいい大人になれるよう、プログラミングを始め興味関心を持ったことを毎日勉強しております !!

よく読まれている記事
【Java】JSPでタグライブラリを使う(JSTL)

【Java】JSPでタグライブラリを使う(JSTL)

こんにちは。エンジニアの新田です!ここでは、システムエンジニアとして働いている私が、システム開発手法や開発言語について紹介していこうと思います。今回は、JSPの標準タグライブラリ「JSTL」について紹介します。Javaについて勉強している方、Webアプリケーションを構築したいと思っている方の参考になれば幸いです!関連記事リンク: 【Java】JSPの基本的な構文/【Java】JSPのアクションタグ

【Java】Stringクラス文字列を操作するメソッドの使い方まとめ!実例も紹介!

【Java】Stringクラス文字列を操作するメソッドの使い方まとめ!実例も紹介!

こんにちは。新人エンジニアのサトウです。システムエンジニアとして駆け出したばかりですが、初心者なりの視点でわかりやすい記事を心がけていますので参考になればうれしいです。プログラム初心者✅にも、プログラムに興味がある人✨も、短い時間で簡単にできますのでぜひこの記事を読んで試してみてください!そもそもStringとは何?『 String 』... Java言語において文字列のデータ型を指します。基本デ

【Java】文字列の置き換え(String#format)!エスケープシーケンスのまとめも!!

【Java】文字列の置き換え(String#format)!エスケープシーケンスのまとめも!!

こんにちは。新人エンジニアのサトウです。システムエンジニアとして駆け出したばかりですが、初心者なりの視点でわかりやすい記事を心がけていますので参考になればうれしいです。プログラム初心者✅にも、プログラムに興味がある人✨も、短い時間で簡単にできますのでぜひこの記事を読んで試してみてください!Stringクラスformatメソッドの文字列整形【java.utilパッケージ】Formatterクラスfo

【Java】文字列格納後に変更可能!?StringBufferクラスとStringBuilderクラス!

【Java】文字列格納後に変更可能!?StringBufferクラスとStringBuilderクラス!

こんにちは。新人エンジニアのサトウです。システムエンジニアとして駆け出したばかりですが、初心者なりの視点でわかりやすい記事を心がけていますので参考になればうれしいです。プログラム初心者にも✅、プログラムに興味がある人✨も、短い時間で簡単にできますのでぜひこの記事を読んで試してみてください!文字列を扱う3つのクラス【java.langパッケージ】java.langパッケージの文字列を扱うクラスにはS

【Java】値?変数?型??しっかり解説!『データ型(プリミティブ型と参照型)』

【Java】値?変数?型??しっかり解説!『データ型(プリミティブ型と参照型)』

こんにちは。新人エンジニアのサトウです。システムエンジニアとして駆け出したばかりですが、初心者なりの視点でわかりやすい記事を心がけていますので参考になればうれしいです。プログラム初心者✅にも、プログラムに興味がある人✨も、短い時間で簡単にできますのでぜひこの記事を読んで試してみてください!プリミティブ型と参照型プログラム開発では型を持った変数を使ってデータのやり取りをしますが、データ型によって仕様