Java

Javaの型変換を完全理解!暗黙的変換とキャストを図解で解説

Javaでは異なるデータ型の値を変数に代入する際に「型変換」が発生します。
型変換には「暗黙の型変換」と「キャスト(明示的な型変換)」の2種類があり、それぞれの仕組みを理解することが重要です。

本記事では、図解を交えながらJavaの型変換について詳しく解説します。
初心者の方も安心して学べるよう、基本から応用まで丁寧に説明しますので、ぜひ最後までご覧ください!

punpee-code
punpee-code
Javaの型変換「①暗黙的変換」と「②キャスト」について図解付きで徹底解説します!

Javaの基本データ型一覧

型変換の仕組みを理解するには、まずJavaの基本データ型について知ることが重要です。以下に一覧表を示します。

種類データ型サイズ表現できる値
整数byte8ビット-128~127
short16ビット-32768~32767
int32ビット-2147483648~2147483647
long64ビット-9223372036854775808~
9223372036854775807
不動小数点数float32ビットIEEE754に基づく値
double64ビットIEEE754に基づく値
文字char16ビットUnicode表現の
\u0000~\uFFFF
真偽booleantrue, false

 

以下の記事データ型に関する記事も参考にしてください。

Javaの基本データ型・参照型の違いを一覧表と図解付きで徹底解説Javaのデータ型を完全解説!基本データ型と参照型の違いや特徴を詳しく説明し、全データ型を一覧で整理しました。初心者にも分かりやすい内容で、Javaの基礎力を徹底強化!...

型変換の2種類:「暗黙の型変換」と「キャスト」

Javaの型変換は「暗黙的の型変換」と「キャスト(明示的な型変換)」の2つ

Javaにおいては以下の2つの型変換によって、左辺と右辺のデータ型が一致せずとも変数の代入を行うことができます。

  1. 「暗黙の型変換」
  2. 「キャスト(明示的な型変換)」

 

Javaの型変換の例

Javaにおいては基本的には以下のように、変数の代入時に左辺と右辺のデータ型を一致させて宣言します。

long number = 123L; // 最後の「L」はlong型であることを示す

 

しかし、変数の代入時に左辺と右辺のデータ型は必ずしも一致する必要はありません。以下の2パターンの場合です。

【①暗黙の型変換】

long number = 123; // 「123」はint型

 

【②キャスト(明示的な型変換)】

double number = (double)123L; // numberの値は「123.0」

 

①暗黙の型変換(ワイドニング)とは?

小さな型を大きな型に代入する事は可能です。

// int→floatに変換。
// fはfloat型の「10.0」となる。
float f = 10;

// まず右辺の「10 + f」で10がint→floatに変換される。
// そして左辺との変換においてfloat→doubleになる。
// dはdouble型の「20.0」
double d = 10 + f;

明示的に型の変換を行わなくても、コンパイルの時に型を変換してくれるからです。

つまり、左の型から右の型への代入は可能ということになります。

  • byte → short → int → long → float → double
    ※char は int以降への代入が可能

図にするとこんな感じでしょうか。

暗黙の型変換ワイドニング図

「大きな箱」に「小さな箱」を入れるのはOKだが、その逆はNGといったイメージです。

ちなみに、この方向の型変換のことを「ワイドニング(Widening)」と言ったりします。結果的に「小さな箱」が「大きな箱」に変換されるからですね。

 

②キャスト(明示的な型変換・ナローイング)とは?

「①暗黙的な型変換」とは反対に、「大きな箱」から「小さな箱」に変換するには、「(変換させたいデータ型)」という「キャスト演算子」をつけることで実現することができます。

// 「1.23」はdouble型。double→floatに変換
float f2 = (float)1.23;

// 「10.1」はdouble型。
// intへの変換で右辺は「10<10」となることから、boolはfalse。
boolean bool = 10 < (int)10.1;

 

明示的に型変換をする必要があるというわけです。

キャスト演算子:「(変換させたいデータ型) 対象の値(変数)」

図にするとこんな感じ。

明示的な型変換ナローイング図

また、この方向の型変換のことを「ナローイング(Narrowing)」と呼びます。「大きな箱」を「小さな箱」に強制的に変換するからですね。

キャスト時の注意点

なお、以下のようにキャストした場合など、値が変わってしまうことがあるため注意しましょう。

  • 大きいサイズから小さいサイズに型変換した場合、データの溢れのため、上位ビットの値が切り捨てられる
// byteの範囲は「-128~127」のため「128」ではデータ溢れ
// bは-128
byte b = (byte)128;

 

  • 少数から整数に変換する際は、小数点以下が切り捨てられる。
// double→intへの変換で小数点以下が切り捨てられる
// valは24
int val = (int)(123 * 0.2);

 

まとめ:Javaの型変換を使いこなそう

「①暗黙の型変換」と「②キャスト(明示的な型変換)」に関して最後に図にしてみました。

まとめ
  • Javaにおいては「①暗黙的な型変換」または「②キャスト(明示的な型変換)」によって、左辺と右辺のデータ型が一致せずとも変数の代入を行うことができる。
  • 「①暗黙的な型変換」では、小さな型を大きな型に暗黙的に代入することができる。
  • 「②キャスト(明示的な型変換)」では反対に大きな型を小さな型に明示的(強制的)に変換する必要がある。(値が変わってしまうこともあるため注意。)

この記事が理解を深める一助となれば幸いです。