Javaのお勉強 ～その8～ キャスト

# 1. はじめに
今回は「**キャスト**」！

キャストは型変換とも呼ばれており、型(int, byte, doubleなど)の変換を行う処理のことです。

int 型を byte 型に変換！
double 型を int 型に変換！
short 型を long 型に変換！

などなど...
~~こういう処理がいずれ必要なので基本編として、早めに記事にしておきます~~
~~それとオブジェクト型は割愛で...~~

このキャストを勉強しましょう！

# 2. キャスト
## 2.1. 基本的なキャストの考え方
そもそも何故、キャストが必要かというと...

例えば、byte 型の変数の値を int 型の変数に代入するということが「**出来ます**」
byte 型と int 型は似た型であり、byte 型が小さくint 型が大きいからです。

![キャプチャ_31.png](https://qiita-image-store.s3.amazonaws.com/0/259129/c5655b9f-41f5-1653-9439-4ac70d5d47a9.png)

上の例をソースに起こすとこうなります。

```java:Main.java
public class Main {
	public static void main(String[] args) {

		// byte 型の宣言
		byte b = 100;
		// int 型の宣言
		int i = b; // int ← byte の代入

	}
}
```
普通に代入できます

----

では反対に、int 型から byte 型に代入するときは、どうなるかというとエラーになります！

![キャプチャ_32.png](https://qiita-image-store.s3.amazonaws.com/0/259129/d905f77a-ae4e-5460-3a7a-9fce09afcc88.png)

何故エラーかというと byte 型より int 型の方が大きく入りきれなくなるからです。

```java:Main.java
public class Main {
	public static void main(String[] args) {

		// int 型の宣言
		int i = 100;
		// byte 型の宣言
		byte b = i; // byte ← int エラーが起こる

	}
}
```

double や float 型の値を int 型などの整数へ代入しようとした場合も、やはりエラーが出てしまいます。
整数の型に小数点以下は、入りませんよね？
表現できる範囲が違うので、「型を合わせて！」という怒られ方のエラーになります。 


## 2.2. 強引にキャスト

しかしだね！どうしても、キャストしなければいけないんだ！という**強い意志**が必要となった場合、「**キャスト**」を使わねばなりません。

**キャストは無理な型変換なので、オススメするものではないですし、乱用はしないでください。**


キャストの記述方法は、
変数の前に(型)を記述します。
変換したい型を入れてくださーい。

先ほどのエラーだと、

byte b = i;

を書き換えて

byte b = (byte)i;

でOK！！

```java:Main.java
public class Main {
	public static void main(String[] args) {

		// int 型の宣言
		int i = 100;
		// byte 型の宣言
		byte b = (byte)i; // byte ← int キャストしたからエラーが起きない！！！

	}
}
```

## 2.3. 副作用のあるキャスト

また、無理やり型を変えてしまうので、double 型を int 型にキャストすると、整数部の値のみが代入されてしまうという副作用があるので注意！
では、実際にその様子を見てみたいと思います。 

```java:Main.java
public class Main {
	public static void main(String[] args) {

		// double 型の宣言 & 初期化
		double doubleNumber = 15.88d;

		// int 型の宣言
		int intNum;

		// int 型へキャスト & 代入
		intNum = (int) doubleNumber;

		// キャスト後の値を表示
		System.out.println(intNum); // intNum が 15 の整数となっている

	}
}
```

double 型を int 型にキャストを行った際に 15.88d の .88d は排除され、intNum に 15 だけが代入されます。

他にも副作用は多々あるので、お気をつけて...(ホラー風

## 2.4. 暗黙的キャストと明示的キャスト

キャストには2種類のキャストがあります。

- Javaが裏で勝手にキャストしてくれる場合
- 明示的にソースにキャスト内容を書く場合（明示的というのは ( ) を使ってキャストすること）

これら二つの違いは、

- 前者が明示的にキャストを行わなくても問題ない場合
- 後者は明示的にキャストを行わないと問題が起こってしまう場合

となっています。

以前、紹介した「[プリミティブ型](https://qiita.com/koukonko/items/e2714f404b9e369b01b7#21-%E3%83%97%E3%83%AA%E3%83%9F%E3%83%86%E3%82%A3%E3%83%96%E5%9E%8B)」の上から下への代入は、明示的にキャストする必要はありませんが、下から上への代入は、明示的にキャストする必要があります。

一応、以下に数値関連の簡単な表を載せておきます。

|型|箱の範囲|
|:-:|:--|
|byte|-128 ～ 127|
|short|-32768 ～ 32767|
|int|-2147483648 ～ 2147483647|
|long|-9223372036854775808 ～ 9223372036854775807|
|float|32bit 単精度浮動小数点数|
|double|64bit 倍精度浮動小数点数|

また、ソースも暗黙的なキャストと明示的なキャストの例も載せておきます。

```java:Main.java
public class Main {
	public static void main(String[] args) {

		// 暗黙的キャスト
		byte b = 1;		 // byte ← int
		short s = b; 	 // short ← byte
		int i = s;		 // int ← short
		long l = i; 	 // long ← int
		float f = l; 	 // float ← long
		double d = f; 	 // double ← float

		// 明示的キャスト必要
		f = (float) d; 	 // float ← double
		l = (long) f; 	 // long ← float
		i = (int) l; 	 // int ← long
		s = (short) i; 	 // short ← int
		b = (byte) s; 	 // byte ← short

	}
}
```

といった感じになります。
~~見づらかったら言ってください~~

# 3. おわりに
今回のキャストはここまでです。
基本的な部分まででカット！！

オブジェクト型にもキャストを使う場面があるのですが、割愛します。後々理解してもらえたほうがいいのかと思ってしまう次第です。

それと構成にだいぶ難儀しています...ﾑﾑﾑ

次回こそは「スコープ」を書きます。
~~制御文などを勉強していないと無理じゃないかと思っていますが、飛ばしてもらってから戻ってきてもらうように工夫したいと思います~~

それと間違いやご不明点などあれば、躊躇なくマサカリを投げてください。全力で刺さりに行きますので！
Twitterだと早く反応できるので助かります。

では、次もがんばるぞい！

次回 →「[Javaのお勉強 ～その9～ スコープ](https://qiita.com/koukonko/items/bd5c554cd1be9c92e543)」