# 형변환 연산자와 자동 형변환

## 형변환 연산자

> ### 형변환이란?
>
> * 변수 또는 상수의 타입을 <mark style="color:blue;">다른 타입으로 변환</mark>하는 것을 의미합니다.
> * <mark style="color:blue;">(타입)피연산자</mark>

|      변환      |     수식    |   결과  |
| :----------: | :-------: | :---: |
|  int -> char |  (char)65 |  'A'  |
|  char -> int |  (int)'A' |   65  |
| float -> int | (int)1.6f |   1   |
| int -> float | (float)10 | 10.0f |

* 아래 예제코드로 학습해 보겠습니다.

{% code lineNumbers="true" %}

```java
class Operator3_1 {
    public static void main(String[] args) {
        int i = 65, num = 10;
        char ch = 'A';
        float f = 1.6f;

        System.out.println("(char)i = " + (char)i);
        System.out.println("(int)ch = " + (int)ch);
        System.out.println("(int)f = " + (int)f);
        System.out.println("(float)num = " + (float)num);
    }
}
```

{% endcode %}

## 자동 형변환

> ### float f = 1234; => int 타입의 값을 float타입의 변수에 저장!
>
> * 상대적으로 int 타입이 float 타입 보다 크기가 작기 때문에 가능합니다.
>
> ### float f = (float)1234; => 사실 변수와 리터럴의 타입을 일치 시켜줘야 합니다.
>
> * 우리가 보는 코드에는 <mark style="color:blue;">형변환이 생략</mark>되어 있었습니다. 즉, <mark style="color:blue;">컴파일러에 의해 자동으로 형변환</mark>된 겁니다.

> ### int i = 3.14f;&#x20;
>
> * 이렇게 <mark style="color:blue;">큰 타입을 작은 타입에 저장</mark>할 때 <mark style="color:blue;">Error</mark> 가 발생합니다.
> * 3.14f 가 int 타입으로 변환될 때 소수점이 사라지면서 원래 값이 달라집니다.&#x20;
> * 즉, <mark style="color:blue;">값 손실</mark>이 발생하는데 이런 경우, <mark style="color:blue;">컴파일러가 자동으로 형변환을 안 해줍니다.</mark>
>
> ### int i = (int)3.14f; => 이렇게 직접 수동으로 형변환을 시켜줘야 합니다.

> ## "기존의 값을 최대한 보존할 수 있는 타입으로 자동 형변환된다."
>
> * 형변환을 하는 이유는 주로 <mark style="color:blue;">서로 다른 두 타입을 일치시키기 위해서인데</mark>, 형변환을 생략 하려면 컴파일러가 알아서 자동으로 형변환을 해야합니다.
> * 따라서 <mark style="color:blue;">표현범위가 좁은 타입에서 넓은 타입으로 형변환하는 경우</mark>에는 값 손실이 없음으로 <mark style="color:blue;">두 타입 중에서 표현 범위가 더 넓은 쪽으로 형변환</mark>됩니다.

* 아래 예제코드로 학습해 보겠습니다.

{% code lineNumbers="true" %}

```java
class Operator3_2 {
    public static void main(String[] args) {
       // 큰 타입을 작은 타입에 저장!
       // int i = 3.14f; // Error 발생
       int i = (int)3.14f; // 형변환 필요!
       System.out.println("i = " + i);
       
        // 예외 경우 확인
        
        // 100 은 int 타입 따라서 아래 코드는 현재 큰 타입(int)을 작은 타입(byte)에 넣고 있음!
        // 컴퓨터는 byte의 범위가 -128 ~ 127 인 것을 알고 있다.
        // 따라서 100을 byte b 에 집어 넣어도 값 손실이 발생하지 않는 다는 것을 알기 때문에
        // 자동으로 형변환을 해준다.
        // byte b = (byte)100; -> 컴파일러가 자동 형변환
        byte b = 100; // OK
        System.out.println("b = " + b);

        // 위의 경우는 100 은 리터럴 즉, 상수이기 때문에 컴파일러가 값을 명확하게 알지만
        // 아래 num 은 변수, 따라서 확신할 수 없기 때문에 Error 발생
        int num = 100;
        // byte b2 = num; // Error 발생
        byte b2 = (byte) num; // byte 타입으로 형변환
        System.out.println("b2 = " + b2);

        //  byte b3 = 1000; // Error 발생, 범위를 넘어감
        byte b3 = (byte) 1000;
        // OK, 그러나 값 손실 발생, b3 에는 -24 가 저장됨
        // 즉, 상수여도 값 손실이 일어나면 자동 형변환 불가능!
        System.out.println("b3 = " + b3);
    }
}
```

{% endcode %}

{% hint style="info" %}
Ref. Java의 정석 기초편 Chapter3(7, 8)

Ref. [형변환](https://www.youtube.com/watch?v=mzC1CGNykL8\&list=PLW2UjW795-f6xWA2_MUhEVgPauhGl3xIp\&index=26)
{% endhint %}
