プリミティブ型と参照型
Javaのデータ型には大きく分類して、プリミティブ型と参照型があります。
プリミティブ型は基本型とも呼び、次の8種類の型があります。
分類 | 型 |
---|---|
真偽型 | boolean |
整数型 | byte, short, int, long |
浮動小数点型 | float, double |
文字型 | char |
参照型はクラス型とも言い、クラスのインスタンス(実態)を格納します。
例えば、次のような自作クラスも参照型となり、そのクラスのインスタンスを格納する変数は、参照型の変数となります。
public class User { private String nama; private int age; public String getNama() { return nama; } public void setNama(String nama) { this.nama = nama; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public static void main(String[] args) { User user = new User(); //Userクラスを格納する参照型の変数 } }
この記事では、Javaのプリミティブ型(基本型)について詳しく解説していきます。
プリミティブ型は、まさにJavaの基本になるため、しっかり覚えておきましょう。
整数型
整数型は、その名の通り整数値を扱う型です。Javaの整数型には、次の4つがあります。
型 | 値の範囲 |
---|---|
byte | -128~127 |
short | -32768~32767 |
int | -2147483648~2147483647 |
long | -9223372036854775808~9223372036854775807 |
リテラルで整数型の値を書くときは、通常は10進表記で書きますが、接頭辞として0b、0、0xを付与すると、2進数、8進数、16進数表記でも書けます。
例えば、整数の100をそれぞれの進数で表記すると、次のようになります。
int int2 = 0b1100100; int int8 = 0144; int int16 = 0x64;
また、桁区切り文字として「_」を使用することもできます。
int i = 199_999;
リテラでの型
リテラルで整数値を書く場合、特に何も指定しないとint型として扱われます。
int i = 100000;
リテラルを、shortやlongとして扱う場合、末尾に型を指定する記号を付けます。
System.out.println(a.getClass().getName()); => java.lang.Integer
浮動小数点型
浮動小数点型は、小数を含む数値を扱うクラスです。Javaの浮動小数点型には次の2つがあります。
型 | 値の範囲 |
---|---|
float | -1.4E-45〜約340澗(かん) |
double | -4.9E-324〜約1.7澗(かん) |
誤差には注意
上の表の通り、floatは4バイト、doubleは8バイトの値の範囲を扱え、広い範囲の数値でも高速に計算がてきます。しかし、その速さとの引き換えに、計算結果に誤差が生まれることがあり、注意が必要です。
次のサンプルコードは、double型の計算結果て、実際に誤差が生じる例です。
double diff = 0.1; double sum = 0; for (int i = 0; i < 10; i++) { sum += diff; } System.out.println(sum);
上のコードでは、「0.1」をsum変数に10回足しています。結果は「1.0」になりそうですが、実際に実際に実行してみると、「0.99999…」のような結果となり、結果に誤差が発生します。
コンピュータでは、数値を内部では2進数で扱っているため、2進数で表現できない小数(循環小数)の場合、適当な値に丸められ、その結果、上記のサンプルコードのような誤差が発生します。
Java以外でも浮動小数点の誤差は発生する
Javaの浮動小数点型は、国際標準規格に準拠している為、その他のプログラム言語でも、規約に準拠していれば、同じように誤差が発生します。Javaに限らす、浮動小数点型の計算する場合は、誤差については注意しましょう。
文字型
char型は、1つの文字を表すデータ型です。内部的にはunicodeて16ビットの整数(0~65535)として文字を表現します。
charのリテラルは、シングルクォートで括って書くか、uxxxxの形式で文字コード指定で書くこともできます。
Stringは基本データ型ではない
皆さんは、文字をプログラムで扱うとき、charよりもStringをよく使うと思います。Stringはよく使うデータ型ですが、Javaではプリミティブ(基本)型ではなく、参照型に位置づけられています。
真偽型(boolean)
真偽型はtrueとfalseの2つ値を表現するデータ型です。trueとfalse以外の値は入りません。
trueが「真」、falseが「偽」と覚えておいてください。
真偽型(boolean)は、例えばチェックボックスのON/OFF状態などの値を格納するのに適したデータ型です。
データ型の変換
ある型から、別の型にデータ。変換することをキャストといいます。
キャストをすれば、intをdouble型に変換するなど、別のプリミティブ型へデータを変換できます。
構文
キャストには、次の構文を使用します。
(変換する型)変数名
例えば、int型の変数をdouble型に変換する場合は、次のように記述します。
// int型の値を宣言 int intValue = 10000; // doubleに変換(キャスト) double doubleValue = (double)intValue;
精度が落ちるキャストには注意
キャストする際の注意として、キャスト前の型のデータ範囲より、キャスト後の基本型で扱えるデータ範囲の方が、小さいとエラーなるか、精度が保証されない変換結果になります。
次のサンプルコードのような、doubleからfloatへのキャストはエラーになります。
double dobuleValue = 4.9E-324; float floatValue = (double)dobuleValue;
上のコードを実行すると、結果が「0」となり、意図しない結果になっていることが分かります。
▪️ 実行結果
0.0
また、浮動小数点を整数型に変換するときも、精度が保証されず、意図しない結果になります。
double dobuleValue = 100.5; int intValue = (int)dobuleValue;
▪️ 実行結果
100
Javaでは、dobuleなどの浮動小数点型の値を、intなどの整数型にキャストすると、小数点が切り捨てられます。
整数を除算するときの丸め込み
整数の除算で、小数が生じるときは、結果がゼロに向かって丸められます。
例えば、「5 / 2」をおこなえば、正しい答えは「2.5 」であるが、int型で除算すると、結果は丸められ「2」になります。
これを正しく計算するには、int型の値を浮動小数点型のfloatまたはdoubleキャストした後、除算を行います。
まとめ
javaのプリミティブ型(基本型)について、解説してきました。それぞれのプリミティブ型は、箱のサイズ(格納できる値の範囲)が決められており、範囲を超える値を入れると、意図しない結果になります。
事前に確認してから、適切な型を使用するようにしましょう。