Javaを触っていると値型(プリミティブ型)や参照型(クラス型)といったものが出てきます。
今回は値型(プリミティブ型)のラッパークラスとなっているintegerについて改めて学習しましょう。
ラッパークラスとは
Javaには型やクラスといった言葉が沢山出てきます。これを理解できているのと居ないのでは今後学習していく上で大きな差が出てきますのでまずは言葉を理解しましょう。
ラッパークラスの”ラッパー”はラップ(包括)することを指します。Integerはラッパークラスに属しますが、これはintやStringの様な型を包括するクラスと思ってください。
具体的に説明すると、例えばintは値型(プリミティブ型)に属します。
値型はメソッドを持たない為、直接呼び出すことが出来ません。
この値型にインスタンスを与えメソッドが使えるようにしたものをラッパークラスと呼びます。
尚、int型のラッパークラスはIntegerクラスとなっています。
Integerの使い方
具体的な使い方を見てみましょう。次のコードを見てください。
public class SampleInteger { public static void main(String[] args) { int num = 1234; System.out.println(Integer.toString(num)); } }
実行結果
1234
このコードは、toStringメソッドを使い文字列変換をかけて出力させるという単純なコードです。通常、int型にはtoStringメソッドを使用することはできませんので「int.toString()」といったような記述は不可能となっていますが、Integerクラスを使うことでtoStringメソッドを使用してもエラーなく出力出来ています。
Integerクラスで数値・文字列変換
変換には”valueOf”、”parseInt”というメソッドが用意されています。
valueOfは引数に指定された数値をString型の値として返します。
parseIntは引数に指定された文字列をint型の値として返します。なお引数に指定できるものは整数の値のみとなっています。
実際には次のように記述します。
public class SampleInteger { public static void main(String[] args) { // 数値から文字列に変換 int num_a = 1234; String str_a = String.valueOf(num_a); System.out.println(str_a); // 文字列から数値に変換 String str_b = "1234"; int num_b = Integer.parseInt(str_b); System.out.println(num_b); } }
実行結果
1234 1234
整数でない文字列や形式的に数値となっていない文字列を変換しようとした場合には「java.lang.NumberFormatException: For input string」という例外が吐き出されます。
public class SampleInteger { public static void main(String[] args) { String str = "1234"; int num = Integer.parseInt(str); System.out.println(num); } }
実行結果
Exception in thread "main" java.lang.NumberFormatException: For input string: "12.34" at java.base/java.lang.NumberFormatException.forInputString(NumberFormatException.java:68) at java.base/java.lang.Integer.parseInt(Integer.java:658) at java.base/java.lang.Integer.parseInt(Integer.java:776) at SampleInteger.Main.main(Main.java:8)
また、指定可能な範囲を超えた数値の文字列変換時にも「java.lang.NumberFormatException: Value out of range」という例外が吐き出されますので注意が必要です。
最大値と最小値について
Integerクラスで指定できる最大値と最小値については、次のように記述して調べることが出来ます。
public class SampleInteger { public static void main(String[] args) { // 最小値の調べ方 System.out.println("最小値:" + Integer.MIN_VALUE); // 最大値の調べ方 System.out.println("最大値:" + Integer.MAX_VALUE); } }
実行結果
最小値:-2147483648 最大値:2147483647
Integer型のオブジェクト比較
Integer型のオブジェクトを比較する場合、比較演算子を使って比較しようとすると同じ値でも”false”となります。
この理由としては、Java 8以前の環境では「new Integer()」を使ってオブジェクトを生成させるので、値が一緒でも別のオブジェクトとしてされ比較演算子が正常に動作しないことが挙げられます。
Java9以降の環境ではIntegerにNew演算子を使用することは非推奨とされているため、新たな方法として「Integer.valueOf()」に変更となりました。
これにより比較演算子を使用してもfalseになることはなくなったのですが、ここではあえてJava 8以前の環境での動作を確認していきます。
まずは以下のコードを見てみましょう。
public class SampleInteger { public static void main(String[] args) { Integer num_A = new Integer(10); Integer num_B = new Integer(10); // 比較演算子による比較 System.out.println(num_A == num_B); } }
実行結果
false
このコードでは、Integerクラスで二つのオブジェクトを生成し、それらを比較演算子で比較した場合の結果ですが、falseと返っていることが分かります。
この問題はequalsメソッドを使用することで簡単に解決することが出来ます。
早速次のコードを見てみましょう。
public class SampleInteger { public static void main(String[] args) { Integer num_A = new Integer(10); Integer num_B = new Integer(10); if(num_A.equals(num_B)) { System.out.println("true"); } else { System.out.println("false"); } } }
実行結果
true
先ほどと同じ比較のサンプルコードですが、こちらでは”true”と返ってくることが確認できました。
まとめ
いかがでしたか?
今回はIntegetについて具体的なコードを踏まえた解説をしてみました。
intと混同されている方も少なからずいらっしゃるようですが、intとIntegerは全く別のものです。
この記事を見てご理解いただけると非常に嬉しく思います。