💭

ITスクールの授業5日目のまとめ2:型変換

2023/07/27に公開

前書き


JAVAは変数を扱う時に、データ型を必ず明示することになっている。そのせいで、変数と変数を演算、もしくは代入する時、お互いのデータ型が異なる場合もある。

その時「型変換」を通じて、データ型が一時的に変わるや、ユーザーが直接変えることができる。まずは「型変換」の種類と特徴、規則などを簡単にまとめてみる。

型変換の種類と規則

  1. 型変換には「自動型変換(Promotion)」と「手動型変換(casting))」がある。
    自動型変換は、代入や演算をする時に各被演算子のデータ型が異なると決まってある規則(下に書く予定です)によってデータ型が自動的に変わって演算や代入を行うことである。演算をうまく行うためにJAVAで自動的にしてくれるもので、便利であるという長所がある。

手動型変換は、ユーザーが型変換の規則の中で、決まってある形式を通じてデータ型を変えることである。自動型変換は一般的な場合[1]にしか行われないが、それ以外に型変換が必要な時には手動で型変換をする。

  1. 型変換の規則:整数から実数に、容量が少ない方から容量が大きい方には自動的変換する。実際の変換の順番は下記のようである。 括弧の中の数字はそのデータ刑の容量(byte)を示す。

注意することは、整数のlong(8)より実数のfloat(4)が大きい方向になるということである。整数から実数に変換される時は、容量に関わらず実数型が大きいことを覚えておこう。

  1. 型変換は演算や代入をする時だけデータ型が変わることで、実際にその変数のデータ型が変わることではない。型変換を使用した演算や代入が行った後、型変換されたデータ型は元に戻る。

自動型変換

自動型変換は、ユーザが別のコードを書かなくても、演算や代入をする時に自動的に行われる。下記は自動型変換の例文である。

PromotionExample
int a = 3; //int型データ(4byte, 整数)
long b = a;//int型データ(8byte, 整数)
System.out.println(a + b); // aのほうが小さいデータなので、(a+b)をする時「a」がint->longに自動型変換されて、そのあと演算を行う。

float c = 2.4f; // float型データ(4byte, 実数)
double d= c; //double型データ(8byte, 実数)
System.out.println(c + d); // cのほうが小さいデータ型なので、(c+d)をする時「c」がfloat->doubleに自動型変換されて、そのあと演算を行う。結果を見ると、小数点が16字書いてあることを見ると、double型データであり、型変換が行ったことが分かる。

int e = 5;
//byte f = e; エラー発生。int型はbyte型より大きいデータ型なので、自動型変換が行わらずエラーが出る。

System.out.println(3/5); //整数と整数の演算なので、型変換が行わらない。
System.out.println(3/5.0); // 整数と実数の演算なので、整数->実数に自動型変換が行われる演算をする。
System.out.println(3.0/5); // 上の行と同じ。実数と整数の演算なので、自動型変換が行われる。
System.out.println(3.0/5.0);//実数と実数の演算なので、自動型変換が行われない。

手動型変換

手動型変換は、ユーザーが決まってある形式であるデータ型を演算や代入の時だけに他のデータ型に変えることである。

手動型変換をする方法は下記のようである。

castingExample
(目標のデータ型)リテラルまたは変数名
//例)(int)a もしくは(char)65

注意事項で、手動型変換では元のデータ型より小さいデータ型にも変換ができるが、場合によってデータが損失危険がある。

CastingDataLostExample
int a = 300;
byte b = (byte)a; //byteより大きいデータであるint型を、byte型に手動型変換する。
System.out.println(b); //300でない、「44」が出力。byte刑は-127から128までの数字しか入らない。そこに300を代入するとデータの損失が出てしまう。

char型は文字を扱うデータであるが、内部的には整数でできている。そのせいで、char刑の値の範囲[2]の数字をchar型に型変換すると、その値に与えられている文字を出力できる。その逆に、ある文字を整数型データに型変換すると、その文字に与えられている整数が出る。

下は文字と整数間の手動型変換が主になるコード例文である。

System.out.println((int)2.5);//「2」出力
System.out.println(2.5 + 3.7); // 6.2
System.out.println((int)2.5 + (int)3.7); // 手動型変換を行った後に足し算をして、「2+3」になる。「5」 出力。
System.out.println((int)(2.5 + 3.7)); //括弧の中を先に演算して、(int)(6.2)になる。型変換をして「6」出力。

System.out.println((char)65); //65に与えられた文字である「A」出力。
System.out.println((char)78); //78に与えられた文字である 「N」出力。
System.out.println((char)89); //「Y」出力。
System.out.println((char)97); //「a」出力。

System.out.println((int)'A'); //文字「A]に与えられている数字「65」が出力。
System.out.println((int)'a'); //文字「a]に与えられている数字「97」が出力。
//System.out.println((char)32);//32は空白文字であって、「 」が出力。

char c = 'c';
char d = 'd';
System.out.println((char)c+d);//文字は内部的には整数となっていて、整数と同じく演算をする。
//「C」は99,「D」は100であって、+演算をすると199になる。「199」が出力。

以上で、型変換についてまとめて、簡単な使用例文もまとめてみた。
自動型変換のほうは本当に文字のまま自動的に行われるので、そういう規則によって作動するんだなと覚えておけばいいと思う。

半面、手動型変換は自分で直接使うもので、制御文や乱数を作る時、文字列の中の文字の変換(例えば、文字列の中の大文字を小文字に変えるとか)する時など、知らないとなかなか進まないコードの作成に使われるので、よく練習をしておくのがいいと思った。

次は本物の制御文に入っていきたいと思う。

脚注
  1. 値の種類(整数/小数/文字/文字列など)ごとに決まっている基本データタイップへの変換、演算のため、容量の大きい方向への変換など ↩︎

  2. charは2byteで、正数だけを持つ。つまり範囲は0~65535になる。 ↩︎

Discussion