Javaをはじめよう!第14回~型変換とは~
2016/02/22
はじめに
前回は単項演算についてご紹介いたしました。
今回は型変換(キャスト)について詳しくご紹介いたします。
演算子
型変換(キャスト)
キャスト演算(データ型の型変換)を説明します。boolean型を除いて、基本データ型同士の値は互いにデータ型を変換することができます。
変換先の値のデータのサイズが変換元の値のデータよりも大きい場合は、自動的に変換先(大きい方)に変換されます。(これを明示的型変換)といいます。
しかし、変換先の値のデータのサイズが変換元の値のデータのサイズよりも小さい場合は、自動的に変換されず明示的に型を変換しなければなりません。注意点としては明示的な型変換は強制的にデータ型を変更しますので、変換後の値が、変換前の値と、変わってしまう可能性があります。
では、暗黙的型変換(小さい型から大きい型へ)からと暗黙的型変換できない(大きい型から小さい型へ)のソースを見てみましょう。
Sample21.java
[code]
package chap02;
public class Sample23 {
public static void main(String[] args){
int i = 123; //int型123を宣言初期化
double d = i; //int型iをdに代入
System.out.println(d);
i= d; //double型をint型に代入
System.out.print(i);
}
}
[/code]
実行例
型の不一致: double から int には変換できませんat chap02.Sample23.main(Sample23.java:9)
上記のようなエラーが発生します。
Sample23.javaの場合、int型からdouble型へは何も問題なく代入されていますが、double型からint型に代入する時に、『型の不一致』というエラーが発生しました。
これは、小さい型から大きい型へは暗黙的に変換されますが、大きい型から小さい型へは、暗黙的に変換されないことを表しています。
では、コンパイルエラーが起きないように、明示的型変換(キャスト変換)をしてみましょう。
キャスト演算子は
(形名) 式
の形式で記述します。指定した式の型を()内で指定した型に変換するという演算子です。
Sample23.java(変更後)
[code]
package chap02;
public class Sample23 {
public static void main(String[] args){
int i = 123; //int型123を宣言初期化
double d = i; //int型iをdに代入
System.out.println(d);
i= (int)d; //double型をint型に代入
System.out.print(i);
}
}
[/code]
実行例
123
今回はコンパイルが通り、実行できました。ここで注目してほしいのは、int型からdouble型に変換された値に小数点がついていること、そして、double型をint型に変換した値から小数点が消えていることです。
前に、基本データ型の項で学習したように、int型は整数値を表し、double型は浮動小数点型を表します。型の変換が行われた事によって、変数の数値が変わってしまっていますね。
今回はint型からdouble型への変換を最初に行いましたので。小数点以下は元々0のため、それほど、問題ではないかもしれません。
しかし、小数点以下の数値を利用したい時に、整数型へキャスト変換すると都合の悪いことが起こることがあります。
次はそのソースを見てみましょう。
Sample22.java
[code]
package chap02;
public class Sample24 {
public static void main(String[] args){
double d = 123.456;
float f = (float)d; //double型をfloat型にキャスト代入
System.out.println(f);
int i = (int)d; //double型をint型にキャスト代入
System.out.println(i);
}
}
[/code]
実行例
123
double型をfloat型にキャスト演算しても、小数点以下は表示されましたがdouble型をint型に変換した場合、小数点以下がすべてが切り捨てられています。
キャスト演算をする時は値の変化に注意して下さい。
また、キャスト演算は大きい値から小さい型だけでなく、小さい型から大きい型へも変換することができます。
しかし、結果は暗黙的型変換と何も変わりません。
実は、暗黙的型変換は代入の時にのみ起こる変換ではありません。通常の変数の宣言と初期化でも起こります。
今までも、数値リテラルを記述する時、暗黙的に型変換され整数であれば、int型、浮動小数点であれば、double型に自動的に変換されていたのです。
さいごに
今回は、キャスト演算について詳しく紹介いたしました!
次回は縮小変換について詳しく紹介いたします!