はじめに
Javaでは、指定したデータ型と一致する型の値を代入するのが基本です。
ただし、自動的型変換やキャストを使ってデータ型の変換を行うことで、異なる型のデータを代入できるようになります。
本記事では、筆者がJavaを学習する中で学んだ基本データ型の代入パターンについてまとめていきたいと思います。
勉強中の身ですので理解が浅い点などあるかと思いますが、本記事を参考にされる方はその点ご了承の上、お読みいただければと思います。
間違いや補足が必要な点などあれば、ご教示いただけると助かります。
目次
1.明示的な型変換(キャスト)
2.サフィックスを使った型指定
3.暗黙的な型変換
4.エラーケース
1.明示的な型変換(キャスト)
変数に値を代入するときは、基本的に定義した基本データ型に合わせた値を代入する必要があります。
int i = 10; //int型変数 ← 整数型の数値を代入
double d = 3.5; //double型変数 ← 浮動小数点型の数値を代入
Javaでは、デフォルトで整数はint、浮動小数点型はdoubleと認識する仕様になっています。ですが、演算に使う場合や代入をするときに型の指定が必要な場合は、以下のように行います。
int i = 10;
short s = (short)i; //int型の整数をshort型に変換
変換したい型名を括弧で囲んで変数の前につけることで、明示的に型変換を行います。
このような変換は、演算時にも使うことができます。
public class CastExample {
public static void main(String[] args) {
int a = 5;
int b = 2;
// int を long にキャストして掛け算
long result2 = (long) a * b;
System.out.println("int→long: " + result2); // → 10
}
}
2. サフィックスを使った型指定
整数型と浮動小数点型では、サフィックスを使って型を示すことができます。
前項でも説明したように、Javaでは整数はint、浮動小数点型はdoubleとなるため、そのまま代入するとエラーになってしまうケースがあります。
long l = 2147483648; //int型整数と認識するが、intの範囲を超えているためエラー
float f = 3.14; //double型小数と認識するが、floatより大きい型なのでエラー
そこで、数値リテラルの末尾にサフィックスを付けて「この数値はlong型(あるいはfloat型)の数値ですよ」と示すことで代入できるようになります。
long l = 2147483648L; //long型整数なので代入可能!
float f = 3.14f; //float型小数なので代入可能!
3.暗黙的な型変換
前項で紹介した明示的なキャストやサフィックスを記述しない場合でも、値を代入できるパターンがあります。
小さい型から大きい型への変換(拡大変換)
小さな型からより大きな型へ代入するときは、自動での型変換が有効です。
例えばint型→long型への変換は、long型の方が表現できるデータの幅が大きくデータの損失が発生しないため、明示的なキャストなしで代入することができます。
| データ型 | 値の表す範囲 |
|---|---|
| byte | 8ビット(-128 ~ 127) |
| short | 16ビット(-32,768 ~ 32,767) |
| int | 32ビット(-2147483648 ~ 2147483647) |
| long | 64ビット( -9223372036854775808 ~ 9223372036854775807) |
byte b = 10; // 代入
short s = b; // byte → short (自動型変換: 拡大変換)
int i = s; // short → int
long l = i; // int → long
以下のコードにおいて10はint型の整数ですが、byte型の変数に代入してもエラーになりません。
byte b = 10;
整数リテラルを代入する場合、代入する値がデータ型の範囲内であれば暗黙的に変換されて代入されます。
※小数リテラルは明示的型変換が必要
4.エラーケース
大きい型から小さい型への変換(縮小変換)
大きい型から小さい型への代入は、データを損失する可能性があるためエラーとなります。
int i = 100;
byte b = i; //byte型<int型のためコンパイルエラー
double d = 3.14;
float f = d; //float型<double型のためコンパイルエラー
long l = 1000;
short s = l; //short型<long型のためコンパイルエラー
エラーを解消するためには、前項で紹介した明示的な型変換を行う必要があります。
int i = 100;
byte b = (byte)i;
double d = 3.14;
float f = (float)d;
long l = 1000;
short s = (short)l;
縮小変換して代入する際は、代入する値が型の範囲をオーバーしていないか確認する必要があります。
boolean型からの変換
boolean型はtrue/falseのみ代入が可能で、数値との変換はできません。
boolean b = true;
int x = b; // コンパイルエラー
char c = b; // コンパイルエラー
まとめ
・拡大変換は自動変換が可能
・縮小変換は、基本的に明示的な型変換が必須
・数値リテラルは型の範囲内であれば暗黙的変換が可能
参考
・Javaの型変換についてざっくりまとめてみた[Java初心者]
・[YouTube]初心者でも分かる基本データ型の型変換:自動とキャストの違いがスパッと分かる!【Java入門講座】2-7 基本データ型の型変換
著者:M.N(株式会社ウィズツーワン)