Javaコラム Javaエンジニアのためのお役立ちコラム

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

2021年08月03日
SE
Integerとはどのようなクラスなのでしょうか。
PM
プリミティブ型intのラッパークラスです。

Integerとは


今回はJavaのIntegerについて説明します。

Integerとはプリミティブ型intのラッパークラスです。と説明されても実感がわかないと思いますので、まずはプリミティブ型について説明していきます。

プリミティブ型と参照型


プログラミングでは、値や変数などのデータを型と呼ばれるもので分類します。これにより、例えば数値の1と文字列の1を判別できます。

Javaプログラミングにおいて、型は大きく分けてプリミティブ型と参照型の2つに分けられます。

プリミティブ型とは

プリミティブ型は数値または論理値を保持するものです。数値を保持する型を数値型と呼び、サイズおよび整数か小数かに応じて、byte、short、int、long、char、float、doubleの7種類が存在します。

対して、論理値を保持するものはboolean型のみでtrueもしくはfalseの値を保持します。プリミティブ型はクラスでないためメソッドを持ちませんが、演算子によって比較や数値演算ができます。

以下にプリミティブ型による演算例を示します。

実行結果は以下のようになります。

このようにプリミティブ型を使用することで、数値同士の比較や演算ができます。

参照型とは

実際に値を保持するプリミティブ型に対し、オブジェクトへの参照を保持する型を参照型と呼びます。ここでオブジェクトとは、動的に生成されたクラス型のインスタンスや配列のことです。

オブジェクトに対して比較や演算、値の設定等がしたい場合は、そのクラスのメソッドを使います。

以下に参照型の比較例を示します。

実行結果は以下のようになります。

str1とstr2は同じ「abc」という文字列を保持しているにもかかわらず、「==」による比較では不一致であるとされています。これは、str1とstr2は同じ値を持っているものの別のオブジェクトであるためです。

一方「equals」メソッドを使用した比較では一致していると判断しています。このようにオブジェクトの値を比較する場合、クラスのメソッドを使用します。

Integerはintのラッパークラス

Javaプログラミングにおいて、プリミティブ型よりも参照型のオブジェクトの方が扱いやすい時もあります。例えば、コレクションというオブジェクトをまとめて管理する機能を使用する場合、プリミティブ型は使用できません。

こういった場合にプリミティブ型の値を内包する参照型のクラスを利用できます。このようなクラスのことをラッパークラスと呼びます。つまり、Integerクラスはプリミティブ型intをオブジェクトとして扱うためのクラスであるということです。

JavaにおけるIntegerの使用方法


ここまででIntegerとはint型数値をオブジェクトとして扱えるようになるクラスであるということを説明してきました。では、ここからは実際にIntegerの使い方をソースコードとともに説明していきます。

数値からIntegerインスタンスの生成

Javaにおいて数値(int型)からIntegerインスタンスを生成する方法を紹介します。以下にソースコードを示します。

変数i1で使用しているのは、一般にオブジェクトを生成する場合と同じようにnewキーワードでコンストラクタを使用する方法です。ただし、この方法はJavaSE9で非推奨となっています。

変数i2で使用しているのは、IntegerクラスのvalueOfメソッドを使用する方法となります。IntegerクラスのvalueOfメソッドは指定されたint値のIntegerインスタンスを返します。JavaSE9ではこちらの方法が推奨となっています。

文字列からIntegerインスタンスの生成

Javaにおいて文字列(String型)からIntegerインスタンスを生成する方法を紹介します。以下にソースコードを示します。

お気づきかもしれませんが、数値と同じ方法で文字列からインスタンス生成できます。コンストラクタを使用する方法がJavaSE9で非推奨となっていることも同様です。

ただし、文字列が数値として解析可能でない場合、NumberFormatExceptionがthrowされることに注意が必要です。使用する際はtry-catch構文でエラーハンドリングするか、事前に文字列を正規表現等でチェックしておくようにしましょう。

Integerインスタンスからプリミティブ型intへの変換

JavaにおいてIntegerインスタンスからint型へ変換する方法を紹介します。以下にソースコードを示します。

前述の通り、参照型であるIntegerインスタンスでは演算子による数値演算はできません。そのため、数値演算するにはint型に変換する必要があります。

そのような場合にintValueメソッドを使用します。IntegerクラスのintValueメソッドはインスタンスの値をintとして返します。

Integerインスタンスから文字列(String型)への変換

JavaにおいてIntegerインスタンスから文字列へ変換する方法を紹介します。以下にソースコードを示します。

数値を文字列に変換するにはtoStringメソッドを使用します。IntegerクラスのtoStringメソッドは数値を10進数表現に変換し、文字列として返します。

ちなみに、引数にint型の値を与えることで、プリミティブ型の数値を直接文字列に変換することもできます。

Integerインスタンス同士の比較

JavaにおいてIntegerインスタンス同士を比較する方法を紹介します。以下にソースコードを示します。

実行結果は以下のようになります。

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では、プリミティブ型の値が自動的にラッパークラスのオブジェクトに変換されたり、その逆の変換が起きたりします。これをボクシング、アンボクシングと呼びます。

以下にその例となるソースコードを示します。

Integer型変数aへint型の数値である10が代入されています。ここでは右辺の10が自動的にInteger型の10にボクシングされています。

int型変数bへInteger型変数であるaが代入されています。ここでは右辺のaが自動的にint型の値にアンボクシングされています。

このボクシング、アンボクシングという機能は一見便利ですが、プログラマの意図しない型変換が起きている可能性があるということになります。そのため、代表的な統合開発環境の1つであるEclipseでは設定でこの機能の使用に対して警告を出す設定ができるようになっています。

SE
Integerの使用方法や注意点などについてよく理解できました。
PM
今後必要になった場合にすぐ活用できるように頭に入れておいても良いでしょう。

Integerは数値をオブジェクトとして扱えるクラス


ここまでIntegerクラスについて紹介してきました。今後Javaにおいてint型の数値をオブジェクトとして扱いたい時が来た際には、ぜひ参考にしてみてください。


Javaでのキャリアアップをお考えの方は、現在募集中の求人情報をご覧ください。

また、直接のエントリーも受け付けております。

エントリー(応募フォーム)

Search

Popular

recommended

Categories

Tags