Integer型について実際のソースコードを交えて紹介・プリミティブ型と参照型

- システム
エンジニア - Integerとはどのようなクラスなのでしょうか。
- プロジェクト
マネージャー - プリミティブ型intのラッパークラスです。
Integerとは
今回はJavaのIntegerについて説明します。
Integerとはプリミティブ型intのラッパークラスです。と説明されても実感がわかないと思いますので、まずはプリミティブ型について説明していきます。
プリミティブ型と参照型
プログラミングでは、値や変数などのデータを型と呼ばれるもので分類します。これにより、例えば数値の1と文字列の1を判別できます。
Javaプログラミングにおいて、型は大きく分けてプリミティブ型と参照型の2つに分けられます。
プリミティブ型とは
プリミティブ型は数値または論理値を保持するものです。数値を保持する型を数値型と呼び、サイズおよび整数か小数かに応じて、byte、short、int、long、char、float、doubleの7種類が存在します。
対して、論理値を保持するものはboolean型のみでtrueもしくはfalseの値を保持します。プリミティブ型はクラスでないためメソッドを持ちませんが、演算子によって比較や数値演算ができます。
以下にプリミティブ型による演算例を示します。
1 2 3 4 5 6 7 8 9 10 |
public class Main { public static void main(String[] args) { int a = 10, b = 20; double c = 30.5; boolean d = (a == b); // aとbの比較 int e = a + b; // aとbの加算 double f = c - e; // cとeの減算 System.out.println("d:" + d + ", e:" + e + ", f:" + f); } } |
実行結果は以下のようになります。
1 |
d:false, e:30, f:0.5 |
このようにプリミティブ型を使用することで、数値同士の比較や演算ができます。
参照型とは
実際に値を保持するプリミティブ型に対し、オブジェクトへの参照を保持する型を参照型と呼びます。ここでオブジェクトとは、動的に生成されたクラス型のインスタンスや配列のことです。
オブジェクトに対して比較や演算、値の設定等がしたい場合は、そのクラスのメソッドを使います。
以下に参照型の比較例を示します。
1 2 3 4 5 6 7 8 9 |
public class Main { public static void main(String[] args) { String str1 = new String("abc"); String str2 = new String("abc"); System.out.println("str1:" + str1 + ", str2:" + str2); System.out.println("str1==str2:" + (str1==str2)); System.out.println("str1 equals str2:" + (str1.equals(str2))); } } |
実行結果は以下のようになります。
1 2 3 |
str1:abc, str2:abc str1==str2:false str1 equals str2:true |
str1とstr2は同じ「abc」という文字列を保持しているにもかかわらず、「==」による比較では不一致であるとされています。これは、str1とstr2は同じ値を持っているものの別のオブジェクトであるためです。
一方「equals」メソッドを使用した比較では一致していると判断しています。このようにオブジェクトの値を比較する場合、クラスのメソッドを使用します。
Integerはintのラッパークラス
Javaプログラミングにおいて、プリミティブ型よりも参照型のオブジェクトの方が扱いやすい時もあります。例えば、コレクションというオブジェクトをまとめて管理する機能を使用する場合、プリミティブ型は使用できません。
こういった場合にプリミティブ型の値を内包する参照型のクラスを利用できます。このようなクラスのことをラッパークラスと呼びます。つまり、Integerクラスはプリミティブ型intをオブジェクトとして扱うためのクラスであるということです。
JavaにおけるIntegerの使用方法
ここまででIntegerとはint型数値をオブジェクトとして扱えるようになるクラスであるということを説明してきました。では、ここからは実際にIntegerの使い方をソースコードとともに説明していきます。
数値からIntegerインスタンスの生成
Javaにおいて数値(int型)からIntegerインスタンスを生成する方法を紹介します。以下にソースコードを示します。
1 2 3 4 5 6 7 8 |
public class Main { public static void main(String[] args) { int i = 10; Integer i1 = new Integer(i); Integer i2 = Integer.valueOf(i); System.out.println("i1:" + i1 + ", i2:" + i2); // i1:10, i2:10 } } |
変数i1で使用しているのは、一般にオブジェクトを生成する場合と同じようにnewキーワードでコンストラクタを使用する方法です。ただし、この方法はJavaSE9で非推奨となっています。
変数i2で使用しているのは、IntegerクラスのvalueOfメソッドを使用する方法となります。IntegerクラスのvalueOfメソッドは指定されたint値のIntegerインスタンスを返します。JavaSE9ではこちらの方法が推奨となっています。
文字列からIntegerインスタンスの生成
Javaにおいて文字列(String型)からIntegerインスタンスを生成する方法を紹介します。以下にソースコードを示します。
1 2 3 4 5 6 7 8 |
public class Main { public static void main(String[] args) { String str = "10"; Integer i1 = new Integer(str); Integer i2 = Integer.valueOf(str); System.out.println("i1:" + i1 + ", i2:" + i2); } } |
お気づきかもしれませんが、数値と同じ方法で文字列からインスタンス生成できます。コンストラクタを使用する方法がJavaSE9で非推奨となっていることも同様です。
ただし、文字列が数値として解析可能でない場合、NumberFormatExceptionがthrowされることに注意が必要です。使用する際はtry-catch構文でエラーハンドリングするか、事前に文字列を正規表現等でチェックしておくようにしましょう。
Integerインスタンスからプリミティブ型intへの変換
JavaにおいてIntegerインスタンスからint型へ変換する方法を紹介します。以下にソースコードを示します。
1 2 3 4 5 6 7 |
public class Main { public static void main(String[] args) { Integer i1 = Integer.valueOf(10); int i = i1.intValue() * 2; System.out.println("i:" + i); // 1:20 } } |
前述の通り、参照型であるIntegerインスタンスでは演算子による数値演算はできません。そのため、数値演算するにはint型に変換する必要があります。
そのような場合にintValueメソッドを使用します。IntegerクラスのintValueメソッドはインスタンスの値をintとして返します。
Integerインスタンスから文字列(String型)への変換
JavaにおいてIntegerインスタンスから文字列へ変換する方法を紹介します。以下にソースコードを示します。
1 2 3 4 5 6 7 8 |
public class Main { public static void main(String[] args) { Integer i1 = Integer.valueOf(10); String str1 = "abc"; String str = str1.concat(i1.toString()); System.out.println(str); // abc10 } } |
数値を文字列に変換するにはtoStringメソッドを使用します。IntegerクラスのtoStringメソッドは数値を10進数表現に変換し、文字列として返します。
ちなみに、引数にint型の値を与えることで、プリミティブ型の数値を直接文字列に変換することもできます。
Integerインスタンス同士の比較
JavaにおいてIntegerインスタンス同士を比較する方法を紹介します。以下にソースコードを示します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
public class Main { public static void main(String[] args) { int a = 10, b = 20, c = 20; Integer ai = Integer.valueOf(a); Integer bi = Integer.valueOf(b); Integer ci = Integer.valueOf(c); System.out.println("ai equals bi:" + ai.equals(bi)); System.out.println("bi equals ci:" + bi.equals(ci)); System.out.println("ai compare to bi:" + ai.compareTo(bi)); System.out.println("bi compare to ci:" + bi.compareTo(ci)); System.out.println("a compare b:" + Integer.compare(a, b)); System.out.println("b compare c:" + Integer.compare(b, c)); } } |
実行結果は以下のようになります。
1 2 3 4 5 6 |
ai equals bi:false bi equals ci:true ai compare to bi:-1 bi compare to ci:0 a compare b:-1 b compare c:0 |
Integerのインスタンス同士が同一の値であるかを知りたい場合はequalsメソッドを使用します。Integerクラスのequalsメソッドは、引数がこのインスタンスと同じint値を含むIntegerオブジェクトである場合のみtrueを返し、そうでない場合はfalseを返します。
同一の値かどうかだけでなく、大小関係まで知りたい場合はcompareToメソッドを使用します。IntegerクラスのcompareToメソッドは、引数がこのインスタンスと同じint値を含むIntegerオブジェクトである場合のみtrueを返し、そうでない場合はfalseを返します。
ちなみに、compareメソッドの引数にint型の値2つを与えることで、プリミティブ型のままcompareToメソッドと同じ結果を得られます。
Integerを使用する際の注意点
ここまでIntegerクラスの使用方法を紹介しました。しかし、数値をオブジェクトとして扱うことによって注意しなければならない点も存在します。ここではIntegerを使用する際の注意点を2つ紹介します。
Integerはオブジェクトのためnullがあり得る
int型と違い、Integerインスタンスはオブジェクトのためnullとなっている可能性があります。nullでないことが事前に保証できない場合は、クラスのメソッドを使用する前にnullチェックしましょう。
自動的にプリミティブ型やラッパークラスに変換されることがある
Javaでは、プリミティブ型の値が自動的にラッパークラスのオブジェクトに変換されたり、その逆の変換が起きたりします。これをボクシング、アンボクシングと呼びます。
以下にその例となるソースコードを示します。
1 2 3 4 5 6 7 |
public class Main { public static void main(String[] args) { Integer a = 10; int b = a; System.out.println(a + b); // 20 } } |
Integer型変数aへint型の数値である10が代入されています。ここでは右辺の10が自動的にInteger型の10にボクシングされています。
int型変数bへInteger型変数であるaが代入されています。ここでは右辺のaが自動的にint型の値にアンボクシングされています。
このボクシング、アンボクシングという機能は一見便利ですが、プログラマの意図しない型変換が起きている可能性があるということになります。そのため、代表的な統合開発環境の1つであるEclipseでは設定でこの機能の使用に対して警告を出す設定ができるようになっています。
- システム
エンジニア - Integerの使用方法や注意点などについてよく理解できました。
- プロジェクト
マネージャー - 今後必要になった場合にすぐ活用できるように頭に入れておいても良いでしょう。
Integerは数値をオブジェクトとして扱えるクラス
ここまでIntegerクラスについて紹介してきました。今後Javaにおいてint型の数値をオブジェクトとして扱いたい時が来た際には、ぜひ参考にしてみてください。
FEnetJava・Javaコラムは株式会社オープンアップシステムが運営しています。
株式会社オープンアップシステムはこんな会社です
秋葉原オフィスには株式会社オープンアップシステムをはじめグループのIT企業が集結!
数多くのエンジニアが集まります。

-
スマホアプリから業務系システムまで
スマホアプリから業務系システムまで開発案件多数。システムエンジニア・プログラマーとしての多彩なキャリアパスがあります。
-
充実した研修制度
毎年、IT技術のトレンドや社員の要望に合わせて、カリキュラムを刷新し展開しています。社内講師の丁寧なサポートを受けながら、自分のペースで学ぶことができます。
-
資格取得を応援
スキルアップしたい社員を応援するために資格取得一時金制度を設けています。受験料(実費)と合わせて資格レベルに合わせた最大10万円の一時金も支給しています。
-
東証プライム上場企業グループ
オープンアップシステムは東証プライム上場「株式会社オープンアップグループ」のグループ企業です。
安定した経営基盤とグループ間のスムーズな連携でコロナ禍でも安定した雇用を実現させています。
株式会社オープンアップシステムに興味を持った方へ
株式会社オープンアップシステムでは、開発系エンジニア・プログラマを募集しています。
年収をアップしたい!スキルアップしたい!大手の上流案件にチャレンジしたい!
まずは話だけでも聞いてみたい場合もOK。お気軽にご登録ください。


Java新着案件New Job
官公庁向け業務システム開発/Java/東京都千代田区/【WEB面談可】/テレワーク
月給39万~44万円東京都千代田区(永田町駅)販売管理システム開発/Java/東京都中央区/【WEB面談可】/テレワーク
月給49万~55万円東京都中央区(京橋駅)生命保険会社向けシステム開発/Java/東京都千代田区/【WEB面談可】/テレワーク
月給42万~48万円東京都千代田区(大手町駅)社会保険システムのパッケージ開発/Java/東京都港区/【WEB面談可】/テレワーク
月給42万~48万円東京都港区(新橋駅)金融機関向けシステム更改/Java/東京都江東区/【WEB面談可】/テレワーク
月給46万~51万円東京都江東区(豊洲駅)大手通信会社者向けWebシステム改修/Java/東京都港区/【WEB面談可】/テレワーク
月給42万~48万円東京都港区(品川駅)