連載
» 2007年02月27日 00時00分 公開

プログラマーの常識をJavaで身につける(3):プログラムにおける数の扱い方の常識 (1/3)

本連載は、Java言語やその文法は一通り理解しているが、「プログラマー」としては初心者、という方を対象とします。Javaコアパッケージを掘り下げることにより「プログラマーの常識」を身に付けられるように話を進めていきます。今回は、「数」に関する常識をJavaで身に付けていきます。

[伊賀敏樹,NTTデータ ビジネスブレインズ]

編集部注

Java言語の基礎を学びたい読者は、連載「【改訂版】Eclipseではじめるプログラミング」をご参照ください。


 今回は、「」に関する常識をJavaで身に付けていきます。数を扱うことはコンピュータやプログラムにとって重要な目的の1つです。また、プログラミング言語により数の取り扱い方に特徴が出ることが多いです。Java言語を通じて、数の扱いを見ていくことにより、それらプログラマーとしての常識を身に付けていきましょう 。

Javaにおける「数」

 最初に、Java言語において数を扱う方法にどのようなものがあるのかを見ていきましょう。Java言語は強く「」付けされたプログラミング言語です。そのため、数を扱う方法も「型」に着眼してみることが有効です。

プリミティブ型と参照型

 Java言語の数に関する型を考えるに当たって、まずはプリミティブ型参照型という視点で見ていきましょう。Java言語では、プリミティブ型による数値の型と、それに対応する参照型が提供されます。この点はJava言語の特徴的な点でもあります。では、プリミティブ型から見ていきましょう。

注釈

ここで扱う話題は、この連載の前提条件としてすでにクリアーしている内容と思います。しかし、重要な内容ですので、復習もかねて見ていきましょう。


表1 プリミティブ型と参照型
プリミティブ型 数値型
整数型
byte
short
int
long
char
浮動小数点型
float
double
boolean型
boolean
参照型 インタフェース型
クラス型
配列型

数に関するプリミティブ型

 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版』を購入することを勧めます。これが一次情報源です。


プリミティブ型と参照型の対応
[java.lang.*の数値型に関するクラス]

 次に、プリミティブ型がどの参照型に対応しているのかを確認しておきましょう。

プリミティブ型 参照型
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 数値型におけるプリミティブ型と参照型の対応
*注釈intIntegerに、charCharacterに対応するように、読み替えの際に注意が必要なものがあります

 おのおののプリミティブ型に対応する参照型には、対応するプリミティブ型で利用すると便利なメソッドが提供されています。なお参照型は、nullを表現できる、という特徴や、一度値をセットすると値を変更できない、という特徴を持っています。

任意精度の整数型 [java.math.BigInteger]

 任意精度の整数型が必要な場合には、java.math.BigIntegerクラスを利用します。具体的には、longで扱える値の範囲を超える整数を扱いたい場合などが想定されます。

long -9223372036854775808以上9223372036854775807以下

デシマル型 [java.math.BigDecimal]

 任意精度の小数点以下の数字を伴う数を扱う必要がある場合に、デシマル型java.math.BigDecimalクラス)を利用します。金額などの数字を決まった精度で計算する必要がある業務系システム開発などで、特によく利用されます(浮動小数点型では、業務系システム開発などには応用がしづらいのです)。

 デシマル型は、小数点付きの数値の四則演算などを、希望する計算精度で正確に実施できますが、実行速度はプリミティブ型に対して相対的に低速になります。

プリミティブ型に対応付けられた数値の参照型を使う

 ここで、プリミティブ型に対応付けられた数値の参照型の使い方について見てみましょう。

 例えば、文字列(正確には、Stringクラスのインスタンス)をプリミティブの数値型に変換したい場合には、対応付けられた参照型を利用して変換を行います。int型に着目し、java.lang.Integerを用いて、Stringをintに変換する例として、下記ParseIntegerSample.javaを実行してみましょう。

ParseIntegerSample.java
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class ParseIntegerSample extends JPanel {

    public ParseIntegerSample() {
        setBackground(Color.white);
    }

    public void paintComponent(final Graphics argGraphics) {

        super.paintComponent(argGraphics);
        setFont(new Font("Dialog", Font.PLAIN, 18));

        final String TARGET = "14921012"; // (1)

        try {
            // 文字列を数値に変換します
            final int result = Integer.parseInt(TARGET); // (2)
            argGraphics.drawString(
                "文字列[" + TARGET + "] → 数値[" + result + "]"
                , 10, 32);
        } catch (NumberFormatException ex) {
            argGraphics.drawString(
                "parse失敗: " + ex.toString(), 10, 32);
        }
    }

    private static void createAndShowGUI() {
        final JFrame frame
            = new JFrame("文字列を数値として解釈するサンプル");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().add(new ParseIntegerSample());
        frame.setLocationRelativeTo(null);
        frame.setSize(400, 400);
        frame.setVisible(true);
    }

    public static void main(final String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGUI();
            }
        });
    }
}

図1 文字列を数値として解釈するサンプル 図1 文字列を数値として解釈するサンプル

 (2)の個所が、実際に Stringからintへと変換を行っているところです。

Integer#parseIntを利用すると Integerオブジェクトではなくintが戻されます

 次に、(1)の個所を、整数を表す文字列としては不適切な文字列に、わざと変更して実行しましょう。

    final String TARGET = "ABCDEFG"; // (1)

 すると、java.lang.NumberFormatExceptionという、数値型に変換しようとした文字列の形式が正しくない場合にスローされる例外が発生します。

図2 文字列を数値として解釈するサンプル(例外発生時) 図2 文字列を数値として解釈するサンプル(例外発生時) ※ウィンドウの横幅を広げると、続きの例外メッセージ内容を確認できます

 なお、java.lang.NumberFormatExceptionクラスはjava.lang.RuntimeException実行時例外)クラスを継承したクラスである点に注意する必要があります。Integer#parseIntの個所における例外処理を行わなくても、コンパイル時の例外チェック対象とはなりません。このため、本来処理しなくてはならない場面において、java.lang.NumberFormatExceptionの例外処理をうっかり忘れてしまう可能性があります。

       1|2|3 次のページへ

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。