Java超|型変換とキャスト

型変換は、値を別の器へ移すJavaの変換技。キャストを理解すると、自動で変わる安全な変換と、情報が失われる可能性がある変換の違いが見えてくる。

Javaでは、変数に値を入れるときや、計算結果を別の変数に代入するときに、 がとても大切になります。

たとえば、int型は整数を扱う型です。

int price = 980;

一方、double型は小数を含む数値を扱える型です。

double weight = 58.7;

同じ 980 という数字でも、int型として扱えば 980、double型として扱えば 980.0 のように表されます。

見た目は似ていますが、Javaの中では「どの型として扱うか」がしっかり区別されています。

この型の違いがあるため、ある型の値を別の型の変数に入れるときには、Javaが自動で変換してくれる場合と、自分で変換を明示しないといけない場合があります。これが、型変換キャスト の考え方です。

ドラゴンボール風にたとえるなら、型は エネルギーを入れるカプセルの種類 です。

int型は、整数の戦闘力だけを入れるカプセルです。

double型は、小数を含む細かい戦闘力まで入れられる大きなカプセルです。

Javaの型扱える値ドラゴンボール風のたとえ
int整数整数の戦闘力カプセル
double小数を含む数値細かい小数エネルギーまで入る大型カプセル
型変換型を変えて扱うこと別のカプセルへエネルギーを移すこと
自動型変換Javaが自動で変換すること小さいカプセルから大きいカプセルへ安全に移す
キャスト型変換を明示すること入りきらない可能性を理解して移し替える指示

小さいカプセルの中身を大きいカプセルへ移すのは、基本的に安全です。

たとえば、int型の 980 を double型に入れると、980.0 として扱えます。

しかし、大きいカプセルの中身を小さいカプセルへ移すと、入りきらない部分が出ることがあります。

たとえば、double型の 58.7 を int型へ入れようとすると、小数部分の .7 が入りません。

このように、情報が失われる可能性がある変換では、Javaは勝手に変換しません。

そこで必要になるのが キャスト です。

型変換とは

型変換とは、ある型の値を別の型の値として扱えるように変えることです。

たとえば、int型の値を double型の変数に代入すると、整数の 980 が double型の 980.0 として扱われます。

int price = 980;
double dprice = price;

この場合、price は int型です。

一方、dprice は double型です。

Javaは int型の 980 を double型の 980.0 に自動で変換してくれます。

変換前変換後
intdouble980 → 980.0
intlong980 → 980
doubleint58.7 → 58。ただしキャストが必要

型変換では、どの方向へ変換するか が大切です。

小さな型から大きな型へは、自動で変換できることが多いです。

しかし、大きな型から小さな型へは、情報が失われる可能性があります。

そのため、そのままでは代入できないことがあります。

ドラゴンボール風に言えば、整数だけを入れる通常カプセルから、小数エネルギーも入る大型カプセルへ移すのは安全です。

しかし、大型カプセルに入っている細かいエネルギーを、整数専用の小さなカプセルへ押し込むと、一部がこぼれてしまうかもしれません。

Javaは、そのような危ない変換を勝手には行いません。

大きなサイズの型に代入する

まずは、Javaが自動で型変換してくれる例を見ていきます。

int型の値を double型の変数に代入する場合です。

ファイル名:Sample8.java

class Sample8
{
    public static void main(String[] args)
    {
        int battlePoint = 980;

        System.out.println("修行カプセルの戦闘力は " + battlePoint + " です。");

        System.out.println("double型の変数に代入します。");
        double detailedBattlePoint = battlePoint;

        System.out.println("修行カプセルの戦闘力は " + detailedBattlePoint + " です。");
    }
}

実行結果

修行カプセルの戦闘力は 980 です。
double型の変数に代入します。
修行カプセルの戦闘力は 980.0 です。

このプログラムでは、最初に int型の battlePoint に 980 を入れています。

int battlePoint = 980;

そのあと、double型の detailedBattlePoint に battlePoint を代入しています。

double detailedBattlePoint = battlePoint;

このとき、battlePoint は int型ですが、detailedBattlePoint は double型です。

Javaは、int型の 980 を double型の 980.0 に自動で変換して代入します。

処理
int battlePoint = 980;980int
double detailedBattlePoint = battlePoint;980.0double

ここでは、int から double への変換なので、Javaが自動で型変換してくれます。

なぜ int から double へは自動で変換できるのか

int型は整数を扱う型です。

double型は、小数を含む数値を扱える型です。

つまり、double型のほうが、int型よりも細かい数値表現に対応できます。

扱える値のイメージ
int整数
double整数と小数

int型の 980 は、double型でも 980.0 として表現できます。

この変換では、情報が失われにくいため、Javaは自動で変換してくれます。

ドラゴンボール風にたとえるなら、int型は整数戦闘力だけを入れる通常カプセルです。

double型は、小数点以下の細かい気のゆらぎまで記録できる大型スカウターカプセルです。

通常カプセルの 980 という戦闘力を、大型スカウターカプセルへ移すと、980.0 として細かく記録できます。

容量に余裕があるため、安全に移せるのです。

図:int から double への自動型変換

この図が示していること

この図は、int型の 980 が double型の 980.0 に自動で変換される流れを示しています。

左側の int型は、整数を扱う型です。

右側の double型は、小数を含む数値を扱える型です。

int型の値を double型へ代入する場合、double型のほうが広い表現に対応できるため、Javaが自動で型変換してくれます。

この変換では、980 という整数の情報が失われにくく、double型では 980.0 として扱えます。

小さな型から大きな型へ値を移す場合は、安全に変換できることが多いため、自動型変換が行われる場合があります。

そのまま代入できる場合とできない場合

型変換では、どの型からどの型へ変換するかが重要です。

代入そのままできるか理由
int → doubleできるdouble のほうが小数も扱える
int → longできるlong のほうが大きな整数を扱える
double → intそのままではできないint では小数部分を表せない

int から double へは、整数を小数も扱える型へ広げるような変換です。

そのため、Javaが自動で変換できます。

一方、double から int へは、小数を含む可能性がある値を整数型へ入れることになります。

この場合、小数部分が失われる可能性があります。

Javaは、情報が失われる可能性がある変換を勝手には行いません。

そのため、double型の値を int型へ入れるには、キャストが必要になります。

小さなサイズの型に代入する

次に、double型の値を int型の変数へ代入する場合を見てみます。

この場合は、そのままではコンパイルできません。

ファイル名:Sample8.java(エラーあり)

class Sample8
{
    public static void main(String[] args)
    {
        double energyWeight = 58.7;

        System.out.println("修行カプセルの重さは " + energyWeight + " キログラムです。");

        System.out.println("int型の変数に代入します。");
        int ienergyWeight = energyWeight;

        System.out.println("修行カプセルの重さは " + ienergyWeight + " キログラムです。");
    }
}

このプログラムでは、double型の energyWeight に 58.7 を入れています。

double energyWeight = 58.7;

そのあと、int型の ienergyWeight に energyWeight を代入しようとしています。

int ienergyWeight = energyWeight;

しかし、これはそのままではエラーになります。

理由は、double型の 58.7 には小数部分があるからです。

int型は整数しか扱えません。

そのため、58.7 を int型に入れると、小数部分の .7 を表せません。

Javaは「小数部分が失われるかもしれない危ない変換だ」と判断するため、自動では変換しません。

なぜ double から int へはそのまま代入できないのか

double型は、小数を含む値を扱えます。

int型は、整数だけを扱います。

値の例小数を扱えるか
int58扱えない
double58.7扱える

double型の値を int型へ入れようとすると、小数部分が入らない可能性があります。

たとえば、58.7 を int型にすると、58 になります。

このとき、.7 の部分は失われます。

これは、Javaにとって安全とは言えない変換です。

そのため、プログラマが「小数部分が失われる可能性を理解したうえで変換します」と明示する必要があります。

ドラゴンボール風にたとえると、double型は小数の気まで入った大型エネルギータンクです。

int型は整数だけを記録する通常カプセルです。

大型エネルギータンクの 58.7 という細かい気を通常カプセルへ移すと、.7 の部分が入りません。

Javaは勝手にこぼすのではなく、「本当にこの変換をしてよいですか」と、プログラマの明確な指示を求めます。

キャスト演算子とは

キャスト演算子は、Javaに対して「この型に変換して使います」と明示するための書き方です。

書き方は次の形です。

(型名)式

たとえば、double型の energyWeight を int型に変換したい場合は、次のように書きます。

(int)energyWeight

これは、energyWeight の値を int型として扱うという意味です。

書き方意味
(int)energyWeightenergyWeight を int型に変換する
(double)battlePointbattlePoint を double型に変換する
(long)countcount を long型に変換する

キャストは、Javaに対して「この変換を自分の判断で行います」と伝える書き方です。

ドラゴンボール風に言えば、キャストは 変換許可の司令札 です。

大型エネルギータンクから通常カプセルへ移すとき、「小数部分が失われる可能性を理解したうえで、この型へ変換する」と明示します。

キャストを使って小さな型へ代入する

double型の値を int型へ代入したい場合は、キャストを使います。

ファイル名:Sample8.java(変更後)

class Sample8
{
    public static void main(String[] args)
    {
        double energyWeight = 58.7;

        System.out.println("修行カプセルの重さは " + energyWeight + " キログラムです。");

        System.out.println("int型の変数に代入します。");
        int ienergyWeight = (int)energyWeight;

        System.out.println("修行カプセルの重さは " + ienergyWeight + " キログラムです。");
    }
}

実行結果

修行カプセルの重さは 58.7 キログラムです。
int型の変数に代入します。
修行カプセルの重さは 58 キログラムです。

ここで大切なのは、58.7 が 58 になっていることです。

int ienergyWeight = (int)energyWeight;

この処理では、double型の energyWeight を int型にキャストしています。

その結果、小数点以下が切り捨てられます。

元の値int にキャストした結果
58.758
12.912
3.13
60.560

ここで注意したいのは、四捨五入ではないことです。

58.7 は 59 になるのではなく、58 になります。

12.9 も 13 ではなく、12 になります。

Javaの double から int へのキャストでは、小数点以下が切り捨てられます。

図:double から int へのキャスト

この図が示していること

この図は、double型の 58.7 が、キャストによって int型の 58 に変換される流れを示しています。

左側の double型では、58.7 のような小数を含む値を扱えます。

右側の int型では、整数だけを扱います。

そのため、double から int へ変換すると、小数点以下の .7 は失われます。

この変換は情報が失われる可能性があるため、Javaは自動では行いません。

(int)energyWeight のようにキャストを書くことで、プログラマが明示的に変換を指示します。

ただし、キャストした結果は四捨五入ではありません。

小数点以下は切り捨てられるため、58.7 は 58 になります。

キャストすると何が起こるのか

キャストは便利ですが、注意も必要です。

特に、double型から int型へキャストすると、小数点以下が切り捨てられます。

double energyWeight = 58.7;
int ienergyWeight = (int)energyWeight;

この場合、ienergyWeight には 58 が入ります。

処理
double energyWeight = 58.7;58.7
int ienergyWeight = (int)energyWeight;58

この変換では、58.7 が 58 になります。

58.7 を四捨五入して 59 にしているわけではありません。

四捨五入ではなく切り捨て

ここはとても大切です。

元の値int キャスト後四捨五入なら
58.75859
12.91213
3.133
60.56061

キャストによる int変換は、小数点以下を切り捨てます。

そのため、小数部分が重要な値では注意が必要です。

ドラゴンボール風にたとえるなら、double型の 58.7 は「58.7段階の気の精度」です。

しかし、int型の通常カプセルには小数の .7 が入りません。

そのため、58段階として扱われます。

細かい気の端数が失われるイメージです。

大きな型への代入でもキャストは書ける

int型から double型への変換は、自動で行われます。

int battlePoint = 980;
double detailedBattlePoint = battlePoint;

このような場合でも、キャストを書くことはできます。

int battlePoint = 980;
double detailedBattlePoint = (double)battlePoint;

どちらも結果は同じです。

書き方結果
double detailedBattlePoint = battlePoint;980.0
double detailedBattlePoint = (double)battlePoint;980.0

ただし、int から double へのように安全に変換できる場合は、Javaが自動で型変換してくれます。

そのため、最初の学習段階では、無理にキャストを書かなくても大丈夫です。

キャストを書くこと自体はできますが、「なぜ書くのか」がはっきりしていないと、かえって読みにくくなることもあります。

安全な変換はJavaに任せ、危ない変換ではキャストで明示する、と考えると整理しやすいです。

自動の型変換と明示的な型変換の違い

型変換には、大きく分けて2つあります。

種類説明
自動の型変換Javaが自動で型を変えるint → double
明示的な型変換キャストを書いて自分で型を変えるdouble → int

Javaは、安全に変換できる場合だけ自動で型を変えます。

たとえば、int から double は安全に変換しやすいです。

int battlePoint = 980;
double detailedBattlePoint = battlePoint;

一方、double から int は情報が失われる可能性があります。

double energyWeight = 58.7;
int ienergyWeight = (int)energyWeight;

この場合は、キャストが必要です。

変換Javaの判断理由
int → double自動で変換する小数型のほうが広く扱える
double → int自動では変換しない小数部分が失われる可能性がある

Javaは型を厳しく管理する言語です。

だからこそ、危ない変換はプログラマに明示させるようになっています。

ドラゴンボール風に言えば、Javaの型チェックは、司令室の安全管理システムです。

安全なカプセル移動は自動で許可します。

しかし、エネルギーがこぼれる可能性がある移動では、必ず変換許可の司令札、つまりキャストを求めます。

Sample8.java 系の流れを整理する

今回扱う Sample8.java 系の流れを整理すると、次のようになります。

ファイル名内容ポイント
Sample8.javaint型を double型へ代入する自動で型変換される
Sample8.java(エラーあり)double型を int型へそのまま代入する小数部分が失われる可能性があるためエラー
Sample8.java(変更後)double型を int型へキャストして代入する小数点以下が切り捨てられる

最初の Sample8.java では、int型の 980 を double型へ代入しています。

これは、小さな型から大きな型への変換なので、自動で行われます。

Sample8.java(エラーあり)では、double型の 58.7 を int型へそのまま代入しようとしています。

これは、小数部分が失われる可能性があるため、そのままではエラーになります。

Sample8.java(変更後)では、(int)energyWeight と書いて、明示的に int型へ変換しています。

その結果、58.7 は 58 になります。

型変換を理解すると演算も分かりやすくなる

型変換とキャストは、代入だけでなく、演算の理解にもつながります。

たとえば、整数どうしの割り算と、小数を含む割り算では、結果の見え方が変わることがあります。

式のイメージ型の考え方
整数どうしの計算整数として扱われやすい
小数を含む計算小数として扱われやすい
int から double へ代入自動で 980 → 980.0 のように変換
double から int へ代入キャストが必要で、小数点以下が切り捨てられる

Javaでは、数値そのものだけでなく、その数値がどの型として扱われているかが重要です。

同じ 58 でも、int型の 58 と double型の 58.0 は、Javaの中では型が違います。

この違いを意識できるようになると、なぜこの結果になるのか、なぜこの代入はエラーになるのかが見えやすくなります。

キャストを使うときの注意点

キャストは、型を変換したいときに便利です。

ただし、特に大きな型から小さな型へ変換するときには注意が必要です。

注意点内容
情報が失われることがあるdouble から int では小数点以下が消える
四捨五入ではない58.7 は 59 ではなく 58
自分で明示する必要がある(int)energyWeight のように書く
必要な場面でだけ使う自動変換できる場面では無理に書かなくてもよい

たとえば、距離や体重、割合、平均値など、小数部分が大切な値では、int にキャストすると必要な情報が失われるかもしれません。

double flightDistance = 12.9;
int iflightDistance = (int)flightDistance;

この場合、iflightDistance は 12 になります。

12.9 の .9 は消えてしまいます。

そのため、キャストは「変換後に情報が失われても問題ないか」を考えて使うことが大切です。

図:型変換とキャストを判断する流れ

この図が示していること

この図は、型変換とキャストが必要かどうかを判断する流れを示しています。

まず、代入先の型を確認します。

次に、元の値の型を確認します。

そのうえで、変換によって情報が失われる可能性があるかを考えます。

int から double のように、整数を小数も扱える型へ移す場合は、Javaが自動で型変換してくれます。

一方、double から int のように、小数を含む値を整数型へ入れる場合は、小数点以下が失われる可能性があります。

そのため、(int)energyWeight のようにキャストを書いて、明示的に変換を指示します。

この図のポイントは、キャストはただ型を書き換える便利な記号ではなく、情報が失われる可能性を理解したうえで使う明示的な変換だということです。

型変換とキャストで覚えておきたいこと

型変換とキャストを学ぶときは、次のポイントを押さえておくと理解しやすくなります。

ポイント内容
型変換ある型の値を別の型として扱うこと
自動型変換Javaが自動で変換してくれること
キャストプログラマが明示的に型を変換すること
int → double自動で変換できる
double → intそのままでは代入できない
(int)energyWeightenergyWeight を int型へ変換する
小数点以下intへキャストすると切り捨てられる

型変換とキャストは、最初は少し細かい話に感じるかもしれません。

しかし、Javaでは型がとても大切です。

変数に値を入れるとき、計算するとき、別の型へ代入するとき、Javaは常に型を意識しています。

ドラゴンボール風にたとえると、型は エネルギーを入れるカプセルの種類 です。

大きなカプセルへ移すときは、安全に移せます。

小さなカプセルへ移すときは、入りきらない部分が失われる可能性があります。

だからこそ、double から int のような変換では、キャストを使って明示的に指示します。

int ienergyWeight = (int)energyWeight;

この1行は、Javaに対して「小数部分が失われる可能性を理解したうえで、int型として扱います」と伝える書き方です。

型を意識できるようになると、Javaの代入や計算結果がずっと読みやすくなります。