※本サイトで紹介している商品・サービス等の外部リンクには、アフィリエイト広告が含まれる場合があります。
こんにちは。こんぶです。
今日は、型変換について学んでいきましょう!
私の自己紹介等は、こちらからどうぞ。
また、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】命令実行の文
それでは、こんぶはじゃ~
コメント