【Javaプログラミング超入門 #08】型変換

 

みのる
こんにちは。笑顔で感謝!✨ みのるコーチです。
今回も、ご覧いただき、ありがとうございます。

今回は

Java超入門 #7
Java の 型変換

というテーマでお送りします。

彩香
データ型について勉強しましたが、今度は型の変換ですね。
頑張ります。今回も、よろしくお願いします。
剛留
今回も、ガッツリ勉強します!
みのる
それでは 早速 行ってみましょう。

【Youtube版】

Youtubeでもお伝えしていますので
是非チェックしてくださいね。

【1】代入の原則

代入演算子で、右辺から左辺にデータを
代入する事を学びました。

そして その時に、大切な原則があります。

それは…

代入の原則
✅ 右辺と左辺のデータ型が同じ。

この事が必要になります。

変数・定数やリテラルは
データ型を持っていましたね。

変数・定数・リテラルのデータ型については
以下の記事で解説しています。

参考にして頂けたらと思います。

【Javaプログラミング超入門 #06】データ型

そして、このデータ型が、代入演算子の
右辺と左辺で、同じである事が必要になります。

変数は「箱」というお話をしましたが
「箱」の形が同じでなければ代入ができません。

まずは、この原則を押さえておきましょう。

【2】自動的な型変換

① 代入時

前のコーナーで、

右辺と左辺のデータ型が同じである事が必要。

というお話をしました。

そして、これを実現するために、左辺と右辺の型が違う場合に
代入する前に、一時的に型を 変換してくれる機能があります。

どんな場合に機能するかというと…

代入時の自動型変換
左辺の型の大きさが大きい場合

データ型は箱という話をしていますが

小さい箱の値は、大きい箱の型に
変換して代入できるという意味です。

大小関係は、以下のようになります。

double > float > long > int > short (char) > byte

ここで、char については1文字を表す文字コードが
格納されています。16ビットです。

この文字コードを数値として扱う場合には
shortの16ビットと同じように扱うことができます。

ただし、このあたりは あまり使われる事がなく

主に 今回の概念に当てはまるのは

double, float, long, int

についてです。

例を見ていきましょう。

int a = 10;
double b = a;

この b = a;

の場合には

【左辺のデータ型】double : 【右辺のデータ型】int

となっていますが、この場合には代入前に
右辺の値が自動的に int から double に変換されます。

つまり、こうなります。

【左辺のデータ型】double : 【右辺のデータ型】double

すると、同じデータ型になり
左辺に代入できることになるのです。

彩香
大きい箱には データが入れられるから
その大きい箱の型に 自動的に変換してくれるんですね。

気が利いくって 感じですね~。

②演算時

次は 演算時のお話しです。
ここでは、2つお話しますね。

❶ 基本データ型

演算の時には、大きな型に揃えられます。

例えば、int と double では、double になります。

そして、この時に 大切な考えがあります。

式は、優先順位 と 結合規則に従って
段階的に 評価されるというお話をしました。

そして、その

式の部分的な評価ごとに型が決まる。

という事です。

例えば、こんな例を考えてみましょう。

double a = 3 / 2 * 2.0;

この式の後の double型変数 a の値は何でしょう。

剛留
3 ÷ 2 × 2 だから 3 だと思います。
彩香
double の 3.0 だと思います。

右辺に 2.0 という double型のリテラルがあるので
double型で 計算されると思います。

みのる
まずは、自分で考えてみること OK ですね!
Nice, Try です!

そして、式を見ていきましょう。

double a = 3 / 2 * 2.0;

この式の中には演算子が3つありますね。

= と / と * ですね。

このうち、優先順位は / と * が同じで
= が最も低い演算子です。

そして、同じ優先順位の / と * は
結合規則が 左から右でした。

前回 見た表を再度見てみましょう。

まず、演算子には、優先順位 と 結合規則 がありましたね。

そして、* と / は 優先順位が高かったですね。
一方で、代入演算子の = は優先順位が低かったです。

また、同じ優先順位の * と / は
結合規則で左から右でした。

演算子の「優先順位と結合規則」と
「評価」についての概念については
以下の記事で解説しています。

参考にしてくださいね。

【Javaプログラミング超入門 #07】演算子

double a = 3 / 2 * 2.0;

すると式の評価は

① /
② *
③ =

の順になります。

まず 3 / 2 を評価しますが
ここは左辺・右辺がともに int型のリテラル ですね。

ですので、この評価結果は int型 となります。
3 割る 2 の商の 1 が評価結果になります。

次に、この 1 と 2.0 の掛け算です。

2.0 は double型のリテラルです。
ですので、評価する時に double型に 揃えられます。

1.0 * 2.0 となって
評価結果は 2.0 となります。

最後が代入演算子。右辺から左辺への代入ですが

ここは左辺も右辺も double なので
そのまま a には、2.0 が代入されます。

ということで、a の値は 2.0 です。

これが

式の部分的な評価ごとに型が決まる。

という事なのです。

剛留
あ~、そういう事なんですね。
彩香
なるほど、なるほど、なるほどです…。
部分的に評価する時に 型 も決まるんですね。

int型 と int型 の部分が先に評価される時は
その部分は int型なんですね。

理解しました。

❷文字列連結

+ の演算子は、左辺または右辺がString型の場合には
文字列連結を行います。

この時にString型でないオペランド(変数・定数・リテラル)は
自動的にString型に変換されます。

この時にも、式は 評価・優先順位・結合規則に沿って
評価される事を 押さえておきましょう。

前回の復習になりますが、評価・優先順位・結合規則の
イメージを再確認しておきましょうね。

このような式を考えましょう。

int e = 50;
int f = 20;

式1)String g = e + f + “円が合計です。”;
式2)String h = “合計は” + e + f + “円です。”;

int型の変数 e は 50, f は 20 で初期化しています。

そして、合計を表示する場合です。

式1では優先順位と結合法則で、この順に評価されますね。
(❶・❷・❸)

e + f の部分は、左辺も右辺も int なので 算術演算子(加算)で
評価の結果は 70 と評価されます。

そして、この70 と “円が合計です。” の + は文字列連結です。
右辺が文字列ですからね。

そして、70 は自動的に文字列に変換されて
文字列連結されるので

評価の結果は “70円が合計です。” になります。

そして、この “70円が合計です。” が左辺に代入されます。

式2では優先順位と結合法則で、この順に評価されますね。
(❶・❷・❸・❹)

まずは “合計は” + e が評価されます。
左辺が String型リテラル なので、文字列連結されます。

50 は自動的に文字列に変換されて
評価結果は “合計は50” になります。

次にこの文字列と 20 が文字列連結されて
“合計は5020” になります。

更に、この文字列と “円です。” が文字列連結され
“合計は5020円です。” になって、この文字列が左辺に代入されます。

ただ、この式2は 本来は e + f を優先的に評価したいですね。
この場合には、() 丸括弧 をつけます。

この () をつければ、優先的に評価されるで
演算子は算術演算子(加算)となり…

int型の 70 が評価の結果になりますね。

そして、最終的に”合計は70円です。”になります。

ここでも、優先順位と結合規則に従って評価されること。

評価される単位でデータ型が決まる事を
押さえておきましょうね。

剛留
ここんところで僕、前回、間違えちゃったんで、
復習しました。完璧に、理解しました。

【3】明示的な型変換

①キャスト

代入時に、左辺の型のほうが大きければ
Javaが自動的に型変換してくれます。

ただし、左辺の型のほうが小さい場合には
明示的に型変換する必要があります。

この型変換することを「キャスト」といいます。

キャスト演算子()を使用して、対象の左側に記述します。

丸括弧の中には、変換したいデータ型を記述します。

例えば、このような感じです。

final double TAX_RATE = 1.08;
int price = 20;

int result = (int) (price * TAX_RATE);

税率を表す TAX_RATE という定数を 1.08 で初期化します。

価格を表す price という変数を 20 (円) で初期化します。

price * TAX_RATE は オペランドの型の大きいほうに
揃えられるので

TAX_RATE の double型 に揃えられて
20.0 * 1.08 で評価結果は 21.6 になります。

そして結果を int型(円単位)にしたい場合を考えます。

この場合に、キャスト演算子を使って
丸括弧の中には、変換したいデータ型 int を書きます。

すると、右辺は小数点以下が切り捨てられた
int型の 21 に変換されます。

すると

【左辺のデータ型】int : 【右辺のデータ型】int
が成り立ちますね。

こうなると、代入が実行できることとなるのです。
左辺の result には 21 が代入されます。

この場合、キャスト演算子を使用しないと
コンパイル時にエラーが出ます。

不適合な型: 精度が失われる可能性があるdoubleからintへの変換

double を intに代入しようとしているからですね。

そして もう1つ、このキャスト演算子は
優先順位が高い事も 注意が必要です。

前回の表に付加しました。
キャスト演算子は、四則演算より上位に位置します。

従って、

int result = (int) (price * TAX_RATE);

この式で (price * TAX_RATE) の括弧をつけないで

int result = (int) price * TAX_RATE;

としてしまうと…。

まずは (int) price が評価されて int型の 20

そして次に 20 * 1.08 が評価されて
double型の 21.6 になります。

最終的に、この doubleの値を result に代入しようと
するのでコンパイル時にエラーが出てしまうのです。

ここも押さえておきましょうね。

②String型

ここでは、String型と 数値(int/double)型の変換について
見ていきましょう。

❶ String型 ⇒ int型の変換

まず、String型をint型に変換する方法です。 
Javaの機能を使用します。

String a = “10”;
int b = Integer.parseInt(a);

この場合 Integer.parseInt(a) を行う事によって
String型 の文字列 が int型の数値に変換されます。

int b = 10; このように変換されて
右辺から左辺への値の代入が できることとなります。

1つの書き方と思って覚えておきましょう。

❷String型⇒double型の変換

次に、String型をdouble型に変換する方法です。
こちらもJavaの機能を使用します。

String c = “12.34”;
double d = Double.parseDouble(c);

この場合には、Double.parseDouble(c) によって
文字列 “12.34” が 数値 12.34 に変換されます。

double d = 12.34; このように変換されて、右辺・左辺ともに
double型となり 右辺の値が左辺に代入される事となります。

❸数値(int/double)型⇒String型

最後は数値データをString型に変換する場合です。

int a = 10;
String aStr = String.valueOf(a);

この場合には、String.valueOf(a)で 数値⇒文字列変換されて
“10” に変換されます。

従って String aStr = “10”; となり
右辺が左辺に代入される事となります。

また、他の簡単な方法もあります。

int a = 10;
String aStr = “” + a;

自動的な型変換を利用して、このように書く方法です。

この場合には + の左辺が文字列(長さが0の文字列)で
右辺はint型変数で、値は 10 です。

この場合には + は連結演算子となりますね。
そして、String型 以外は自動的に String型 に変換されます。

従って、 String aStr = “” + “10”; となって
String aStr = “10”; となり、左辺に代入されることとなります。

String型と 数値(int/double)型の変換について
まとめると、このようになります。

String型から int型への変換は
Integer.parseInt(String型変数)
String型から double型への変換は
Double.parseDouble(String型変数)
数値型から String型への変換は
String.valueOf(数値型変数)

または

“” + 数値型変数

という方法で変換します。

彩香
変換方法が、色々と出てきたので
しっかり、ノートしておきました。

実際にプログラミングしながら、習得していきます。

剛留
僕も、出来る範囲で、頑張ります~。

【4】入出力・エスケープ

プログラミングを していく上での
知っておきたいことを 2つ お話していきます。

①標準入出力

Javaの標準入出力
✅ 標準入力:キーボードからの入力
✅ 標準出力:画面表示

Javaの標準入出力は
キーボードからの入力を標準入力として
画面表示を標準出力として扱います。

ここでは、基本的なJava機能の使い方を お伝えしていきます。

❶ キーボードからの1行入力

str = new java.util.Scanner(System.in).nextLine();

String型変数の str に キーボードから入力した1行を
代入する場合には、このように書きます。

右辺の書き方には、それぞれ意味がありますが
少し学習が進んだところで 説明していきますね。

今のところ、これで入力した1行の文字列が受け取れる
と理解しておきましょう。

少し長いですが、コピーできるようにしておいて
コピーして使うなどして使っていきましょう。

❷ 画面への表示

System.out.println(表示したい内容);
System.out.print(表示したい内容);

画面表示については、既に学んだ通り

内容を表示して改行する場合には
System.out.println を使います。
改行しない場合には…
System.out.print を使います。

まとめると、こうなります。

②エスケープシーケンス

エスケープシーケンス
✅ 文字列リテラルや文字リテラルを
  記述する時に使用する。

✅ 改行やTabなどの特別な意味を
  表す方法。

✅ \(円記号)を使って後の文字に
  特別な意味を持たせる。

この、エスケープシーケンスは
改行などの制御文字の表現とともに

文字列リテラルの開始・終了を表す “(ダブルクォーテーション)を
文字列の中で表現する場合などにも 使用します。

良く使われる エスケープシーケンスは
このようなものがあります。

改行を表す \n

Tabを表す \t

“(ダブルクォーテーション) を表す \”

‘(シングルクォーテーション) を表す \’

\ 記号自体を表す \\

System.out.println(“24歳の\”剛留くん\”は\nJava勉強中。”);

例えば、このように書いた場合…
画面に表示される内容は、このようになります。

24歳の”剛留くん”は
Java勉強中。

改行されている事と、”(ダブルクォーテーション)が
表示される事を 確認しておきましょうね。

彩香
キーボードからの入力を 受け取れるのって
何だか、本格的な感じがしますね。

進化してきた感じがしています。

剛留
ですね。ですね。ですね。しっかり、進化している感じします。
これからも、頑張りますっ!

【まとめ】

【1】代入の原則
・ 右辺と左辺のデータ型が同じ。
【2】自動的な型変換
① 代入時

・左辺の型が大きい時のみ
 右辺の型を自動的に型を変換してから代入。
 (一時的に型変換する)

・型の大小関係
 double > float > long > int
  > short (char) > byte

② 演算時

 ❶ 基本データ型

  ・演算の時には、大きな型に揃えられる。
  ・優先順位と結合規則に従って
   段階的に評価される毎に型が決まる。

 ❷ 文字列連結

  ・演算子 + は、左辺・右辺のどちらかが
   String型の時には 文字列連結 となる。
  ・このとき、String型でないオペランドは
   自動的に String型に変換される。

【3】明示的な型変換
①キャスト

・明示的に型変換することを「キャスト」という。
・キャスト演算子 () を使用して
 この丸括弧の中には変換したいデータ型を記述。

② String型

 ❶String型⇒int型の変換
  ・Integer.parseInt(String型の変数)

 ❷String型⇒double型の変換
  ・Double.parseDouble(String型の変数)

 ❸数値(int/double)型⇒String型
  ・String.valueOf
   (数値型の変数)

【4】入出力・エスケープ
① 標準入出力

 ❶ キーボードからの1行入力

  str = new java.util.Scanner(System.in).nextLine();

  ※ str は取得した 文字列を格納する String型の変数。

 ❷ 画面への表示

  ・System.out.println(表示したい内容);
  ・System.out.print(表示したい内容);

② エスケープシーケンス

・\(円マーク)の後に定められた文字を記述する事で
 制御文字などの特別な文字を表現する方法。