【Java-11】計算の文⑥型変換

初心者向けJava講座

※本サイトで紹介している商品・サービス等の外部リンクには、アフィリエイト広告が含まれる場合があります。

こんぶ
こんぶ

こんにちは。こんぶです。

今日は、型変換について学んでいきましょう!

私の自己紹介等は、こちらからどうぞ。

また、Javaの学習を最初から進めていきたい方は、Java-1から見てみてくださいね。

型変換

演算子の多くは、原則として左右のオペランドが同じ型である必要がありますが、違う型に代入したり違う型で計算しても文法エラーにならないことがあります。なぜかというと、Javaが式を評価する過程で自動的に型を変換してくれているからです。

Javaには型を変換する仕組みが3つあり、「代入時の自動型変換」「強制的な型変換」「演算時の自動型変換」になります。

順番に説明していきます。

基本的には、ある型で宣言された変数には、その型の値しか代入できませんが、Javaの数値型の意味的な大小関係で「小さな型」の値を「大きな型」の変数に代入する場合に限り、値を代入先の変数の型に自動的に変換してから代入してくれます。

Javaの数値型の意味的な大小関係は、次のようになります。

byte型 short型 int型 long型 float型 double型

逆に、Javaの数値型の意味的な大小関係で「大きな型」の値を「小さな型」の変数に代入すると、コンパイルエラーとなります。

ですが、byte型とshort型の変数に数値リテラルを代入できないと困るため、byte型とshort型の変数にint型リテラルを代入することは例外として認められています。

代入時の自動型変換の例:「double a = 60;」のように記載すると、int型の値「60」をdouble型に自動的に変換してから「a」に代入してくれます。

余談になりますが、char型は文字を扱う型ですが、内部では0~65535の範囲の数値として情報を管理しています。厳密には数値型の1種でもあるため算術演算や型変換も行えますが、char型を数値として利用することはほとんどありません

先ほどJavaの数値型の意味的な大小関係で「大きな型」の値を「小さな型」の変数に代入することはできないと言いましたが、プログラム中で明示的に指示をすれば、Javaは型変換と代入を強行します。

例えば、int型のdayという変数に、double型である「5.5」を強制的にint型に変換して代入する場合、「int day =(int) 5.5;」のように記載します。この式の結果、dayには「5」が代入されることになります。

このように強制的な型変換を指示する「(int)」等を「キャスト演算子」といいます。

キャストによる強制的な型変換は「(変換先の型名) 式」のように記述します。

例からも分かるように、キャスト演算子は、元データの一部を失ってでもデータを強制的に変換するため、入りきらない情報は捨てられてしまい、情報の欠損が発生します。

データの欠損が不具合につながることもあるため、よほどの理由がない限りは使用しません。

算術演算子等により計算が行われる場合も、基本的には左右のオペランドが同じ型であることが必要です。

算術演算の結果は計算で使用されたオペランドの型となりますが、異なる型で演算を行った場合、Javaの数値型の意味的な大小関係で「大きな型に統一されてから演算が行われます。

例えば、「3.0/2」を評価するとします。double型の「3.0」とint型の「2」の演算になるので、「大きな型」であるdouble型に統一され、「3.0/2.0」に自動的に変換してから評価されます。結果はdouble型で「1.5」となります。

byte型とshort型については、演算時にも無条件で強制的にint型に変換されます。なので、byte型の変数bとcを足す場合、byte a =b + c;ではなく、「int a =b + c;」とする必要があります。

また、1つの式に数値型とString型の2種類のオペランドがある場合は、数値型をString型に自動的に変換してから、文字列として連結されます。

今回のまとめ

★Javaの数値型の意味的な大小関係:byte型 < short型 < int型 < long型 < float型 < double

★「小さな型」の値を「大きな型」の変数に代入する場合、値を代入先の変数の型に自動的に変換してから代入される

★「大きな型」の値を「小さな型」の変数に代入すると、コンパイルエラーとなる

★プログラム中で明示的に指示をすれば、「大きな型」の値を「小さな型」の変数に代入できる

★キャストによる強制的な型変換は「(変換先の型名) 式」のように記述する

★キャスト演算子は、元データの一部を失ってでもデータを強制的に変換するため、情報の欠損が発生する

★異なる型で算術演算を行った場合、「大きな型に統一されてから演算が行われる

★byte型とshort型については、演算時にも強制的にint型に変換される

キャスト演算子:強制的な型変換を指示するもの

次回は、mainメソッドの1つである「命令実行の文」について説明していこうと思います。

今回の内容のチャレンジ問題はこちらです→チャレンジ問題【Java-11】

次の内容に進む方はこちらです→【Java-12】命令実行の文

それでは、こんぶはじゃ~

コメント

タイトルとURLをコピーしました