型変換
型には、ある型で宣言された変数にはその型の値で代入する必要があるという特徴があります。
int型にはint型だけ、String型にはString型だけ、というように値を入れることになります。
「src」フォルダに「com.cmps.conversion」パッケージを作成し、「Conversion」クラスを作成してください。
クラス作成後に以下のソースを記入してください。
public static void main(String[] args) {
/*
* 他の型での変換(Java17以降)
*/
//int型
int dataInt = 15;
//byte型
byte dataByte = 0;
//合わない型を無理やりあてはめようとすることでエラーが発生します。
dataByte = dataInt;
System.out.println(dataInt + ":" + dataByte);
}
この処理ではbyte型の変数に対してint型、という別の値を入れようとしていますが、
同じ型ではないため、処理をしようとするとエラーが発生します。
このエラーが発生することで、想定していない値が誤って入ることを防ぐようJavaで設定されています。
では、どのようにして格納すればよいでしょう。
以下のソースを記入してみてください。
public static void main(String[] args) {
/*
* 小さい値から大きな値への変換
*/
//byte型
byte sampleByte = 15;
//int型
int answerInt;
//int型はbyte型より大きいため、値をそのまま入れることができます。
answerInt = sampleByte;
System.out.println(answerInt);
/*
* 他の型での変換(cast版)
*/
//int型
int sampleInt = 15;
//byte型
byte answerByte;
//値の前に(byte)を入れることで値をbyte型の値として扱うことができます。
answerByte = (byte) sampleInt;
System.out.println(answerByte);
}
値の変換を行うときは小さい値から大きい値へと自動変換できるという特徴があります。
具体的には、【byte -> short -> int -> long -> float -> double】の順番で変換することが出来ます。
今回の場合、byte型からint型への変換は小さい値から大きい値への変換ルールを守っているため、
「answerInt」にbyte型のデータが入り、処理することが可能です。
もう一つ、大きい値から小さい値に変換するときは、型変換をして入れることが可能です。
「answerByte = (byte) sampleInt」の部分を見たときに、(byte)という特殊な代入をしています。
これはsampleIntのint型を強制的にbyte型に変換して処理する。という処理をしています。
このように一度作成した値を他の型に変換することをキャストと呼びます。
他にも、double型へ変換する場合には「(double) 変数」、
short型へ変換する場合には「(short)変数」といった形で処理が出来ます。
以下のソースを記入してみましょう
// doubleをintへ変換
double sampleDouble = 10.5; // double型変数
int testInt; // int型変数
testInt = (int)sampleDouble;
System.out.println(testInt);
// intをshortへ変換
short testShort; // short型変数
testShort = (short)testInt;
System.out.println(testShort);
キャストの注意
小さい値に大きい値を入れるキャストを行う際に気を付けなければいけない点があります。
変換が不可能な値を入れてしまう
public static void main(String[] args) {
String data = "1000";
int Int = 0;
Int = (int) data;
System.out.println(Int + ":" + data);
}
上記の処理では、文字列を整数を扱うint型へ代入しようとしています。
しかし、文字列を数字として扱うことはできないためエラーが発生します。
ちなみに文字列を数字に変換する場合、「Integer.parseInt(String変数);」を使用することで変換が可能となります。
以下の構文を使うことで、他の型変換も同様に行う事が出来ます。
ラッパークラス.parse型名(文字列型の値)
以下のコードを記入してみましょう。
// Stringをint型へ変換
String testString = "12345";
int conversionInt = Integer.parseInt(testString);
System.out.println(conversionInt);
// Stringをbyte型へ変換
String testString2 = "127";
byte conversionByte = Byte.parseByte(testString2);
System.out.println(conversionByte);
// Stringをfloat型へ
String testsString3 = "1.2345";
float conversionFloat = Float.parseFloat(testsString3);
System.out.println(conversionFloat);
それぞれ変換されて出力されていることが確認できるかと思います。
発展:変換した値が元の値の許容量を超えてしまう
public static void main(String[] args) {
int input = 257;
byte output = 0;
output = (byte) input;
System.out.println(input + ":" + output);
}
この処理では、byte型の「outputData」に値を入れて実行していますが、実行して出力内容を見てみると、「257:257」ではなく「257:1」と表示されています。
byte型に入る値は-128~127までの値ですが、それ以上の値を入れようとすると、
-128から値を入れ直す特徴があります。
型が格納できる値より大きい数字を入れると、最大値の次は最低値になり、それが延々と続くイメージです。
練習問題
「com.cmps.conversion」パッケージ内に「ConversionQuestion」を作成し、解きましょう。
問1:以下の変数を使用し、除算した結果をfloat型で小数点以下の値を含めて表示しましょう。(3.333…)
int num = 10;
int fig = 3;
問2:以下の文字列を変換し和を求めましょう。
string str = "10";
string word = "5";
