型変換

型変換

Javaの変数にいろいろな型があることは既に学習しました。ここではいろいろな型の変数どうしでの代入や演算について考えてみましょう。

次のコードのように、16という値を持つint型の変数inumをdouble型の変数dnumに代入するとどうなるでしょうか。

OperatorSample05.java
class OperatorSample05 {
    public static void main(String[] args){
        int inum = 16;
        double dnum = inum;
        System.out.println("inum= " + inum);
        System.out.println("dnum= " + dnum);
    }
}
OperatorSample05の実行結果
inum= 16
dnum= 16.0

int型の変数の値をdouble型の変数に代入した場合、int型の値はdouble型に変換されて代入されます。これを表示するとdouble型の方は小数点以下の".0"が付いた状態で表示されます。このように型が変換されることを型変換といいます。

では逆にdouble型の変数dnumをint型の変数inumに代入するとどうなるでしょうか。

OperatorSample06.java
class OperatorSample06 {
    public static void main(String[] args){
        double dnum = 16.5;
        int inum = dnum;
        System.out.println("dnum= " + dnum);
        System.out.println("inum= " + inum);
    }
}

このコードをコンパイルしようとしても、次のようなメッセージが出てコンパイルに失敗してしまいます。

OperatorSample06.java:4: 精度が落ちている可能性
検出値  : double
期待値  : int
        int inum = dnum;
                   ^
エラー 1 個

メッセージの通り、double型の変数の値をint型の変数にそのままに代入する場合は、精度が落ちてしまう可能性があるので、コンパイル自体が許されないのです。

キャスト演算子

ではOperatorSample06.javaをコンパイルできるように修正してみましょう。

OperatorSample06A.java
class OperatorSample06A {
    public static void main(String[] args){
        double dnum = 16.5;
        int inum = (int) dnum;
        System.out.println("dnum= " + dnum);
        System.out.println("inum= " + inum);
    }
}

OperatorSample06.javaの

        int inum = dnum;

の部分を

        int inum = (int) dnum;

のように変更しただけです。さて、これは一体何を意味しているのでしょうか。Javaでは型を明示的に変換するためにはキャスト演算子を使います。

一般的には次のような構文になります。

構文 : キャスト演算子
(型名)式

(型名)の部分がキャスト演算子で、指定した式の型を( )内の型に変換してくれるのです。この例ではdouble型の変数dnumの型をint型に変換しています。

さあ、今度はコンパイルできるはずです。実行結果は次のようになります。

OperatorSample06Aの実行結果
dnum= 16.5
inum= 16

今回は精度が落ちることを覚悟の上で、明示的にdouble型をint型に変換しているので、コンパイラはエラーを出さなかったのです。ただし、16.5という値はint型では表せませんから、小数点以下は切り捨てられて、16という整数がinumに代入されることになります。

型変換をするにはキャスト演算子を使う。

異なる型どうしの演算

次に、異なる型どうしの演算を試してみましょう。例えば、double型の変数とint型の変数のかけ算をしたらどうなるのでしょうか。

OperatorSample07.java
class OperatorSample07 {
    public static void main(String[] args){
        int r = 4;
        double pi = 3.14;
        System.out.println("円周 = " + 2 * pi * r);
    }
}
OperatorSample07の実行結果
円周 = 25.12

Javaでは、大きなサイズの型と小さなサイズの型の演算では、小さなサイズの型を大きなサイズの型に変換してから演算を行い、結果も大きなサイズの型になります。したがって、今回の例では

2 * pi * r

という式の"2"と"r"をどちらもdouble型に変換してから演算が行われ、式の値もdouble型になったのです。だから小数点以下が切り捨てられず、25.12と表示されたわけです。