本連載は、Java言語やその文法は一通り理解しているが、「プログラマー」としては初心者、という方を対象とします。Javaコアパッケージを掘り下げることにより「プログラマーの常識」を身に付けられるように話を進めていきます。今回は、「数」に関する常識をJavaで身に付けていきます。
今回は、「数」に関する常識をJavaで身に付けていきます。数を扱うことはコンピュータやプログラムにとって重要な目的の1つです。また、プログラミング言語により数の取り扱い方に特徴が出ることが多いです。Java言語を通じて、数の扱いを見ていくことにより、それらプログラマーとしての常識を身に付けていきましょう 。
最初に、Java言語において数を扱う方法にどのようなものがあるのかを見ていきましょう。Java言語は強く「型」付けされたプログラミング言語です。そのため、数を扱う方法も「型」に着眼してみることが有効です。
Java言語の数に関する型を考えるに当たって、まずはプリミティブ型と参照型という視点で見ていきましょう。Java言語では、プリミティブ型による数値の型と、それに対応する参照型が提供されます。この点はJava言語の特徴的な点でもあります。では、プリミティブ型から見ていきましょう。
ここで扱う話題は、この連載の前提条件としてすでにクリアーしている内容と思います。しかし、重要な内容ですので、復習もかねて見ていきましょう。
表1 プリミティブ型と参照型 | ||||||||||||||||||||||||
|
Java言語のプリミティブ型には、数値型という型が提供されています。数値型には、整数型と浮動小数点型とがあります。
整数型 | 値の範囲(以下の範囲の整数となる) |
---|---|
byte | -128以上 127以下 |
short | -32768以上 32767以下 |
int | -2147483648以上2147483647以下 |
long | -9223372036854775808以上9223372036854775807以下 |
char | ’\u0000’以上 ’\uffff’以下。つまり、0以上 65535以下 |
表2 整数型の一覧、および値の範囲 |
これを見ていると、char(文字)なども整数の仲間なのですね。意外だという方はいらっしゃいましたか? なお、char(文字)だけは負の(マイナスの)値を取りません。
浮動小数点型 | 概念的に関連付けられている対象 |
---|---|
float | ANSI/IEEE規格 754-1985 単精度32bit形式による数値と演算操作 |
double | ANSI/IEEE規格 754-1985 倍精度64bit形式による数値と演算操作 |
表3 浮動小数点型の一覧 |
浮動小数点型について、難しい記載がされていますね。浮動小数点型を利用する人はこれら浮動小数点型の特徴やその計算精度について正しい理解をしていることが求められます。一方で、浮動小数点型を利用しない人は、これらの仕様をほとんど理解していませんし、理解する必要もほとんどありません。
上記2つの表の引用元である『Java言語仕様 第3版』の英語版は、インターネット上に公開されています。『Java Language Specification, Third Edition』をご参照ください。また、ある程度専門的に Java言語に取り組むのであれば、ここで参考文献として利用している『Java言語仕様 第3版』を購入することを勧めます。これが一次情報源です。
次に、プリミティブ型がどの参照型に対応しているのかを確認しておきましょう。
プリミティブ型 | 参照型 |
---|---|
byte | java.lang.Byte |
short | java.lang.Short |
int | java.lang.Integer |
long | java.lang.Long |
char | java.lang.Character |
float | java.lang.Float |
double | java.lang.Double |
表4 数値型におけるプリミティブ型と参照型の対応 *注釈:intがIntegerに、charがCharacterに対応するように、読み替えの際に注意が必要なものがあります |
おのおののプリミティブ型に対応する参照型には、対応するプリミティブ型で利用すると便利なメソッドが提供されています。なお参照型は、nullを表現できる、という特徴や、一度値をセットすると値を変更できない、という特徴を持っています。
任意精度の整数型が必要な場合には、java.math.BigIntegerクラスを利用します。具体的には、longで扱える値の範囲を超える整数を扱いたい場合などが想定されます。
long | -9223372036854775808以上9223372036854775807以下 |
---|---|
任意精度の小数点以下の数字を伴う数を扱う必要がある場合に、デシマル型(java.math.BigDecimalクラス)を利用します。金額などの数字を決まった精度で計算する必要がある業務系システム開発などで、特によく利用されます(浮動小数点型では、業務系システム開発などには応用がしづらいのです)。
デシマル型は、小数点付きの数値の四則演算などを、希望する計算精度で正確に実施できますが、実行速度はプリミティブ型に対して相対的に低速になります。
ここで、プリミティブ型に対応付けられた数値の参照型の使い方について見てみましょう。
例えば、文字列(正確には、Stringクラスのインスタンス)をプリミティブの数値型に変換したい場合には、対応付けられた参照型を利用して変換を行います。int型に着目し、java.lang.Integerを用いて、Stringをintに変換する例として、下記ParseIntegerSample.javaを実行してみましょう。
ParseIntegerSample.java | |
|
(2)の個所が、実際に Stringからintへと変換を行っているところです。
Integer#parseIntを利用すると Integerオブジェクトではなくintが戻されます
次に、(1)の個所を、整数を表す文字列としては不適切な文字列に、わざと変更して実行しましょう。
final String TARGET = "ABCDEFG"; // (1) |
すると、java.lang.NumberFormatExceptionという、数値型に変換しようとした文字列の形式が正しくない場合にスローされる例外が発生します。
なお、java.lang.NumberFormatExceptionクラスはjava.lang.RuntimeException(実行時例外)クラスを継承したクラスである点に注意する必要があります。Integer#parseIntの個所における例外処理を行わなくても、コンパイル時の例外チェック対象とはなりません。このため、本来処理しなくてはならない場面において、java.lang.NumberFormatExceptionの例外処理をうっかり忘れてしまう可能性があります。
Copyright © ITmedia, Inc. All Rights Reserved.