본문 바로가기

Programming Language/JAVA

형변환 연산자, 자동 형 변환

형변환 연산자

 

형변환이란, 변수 또는 상수의 타입을 다른 타입으로 변환하는 것 

 

사용 방법 : (타입) 피연산자

 

 

double d = 85.4;
int score = (int)d;

int score = (int)85.4;
int score = 85; // 정수형으로 형변환해서 소수점은 사라진다. 

// 주의! d의 값은 85.4로 변하지 않는다! score의 값이 저장된 것

 

 

변환 수식 결과
int --> char (char)65 'A'
char --> int  (int) 'A' 65
float --> int (int)1.6f 1 (반올림이 되지 않는다.)
int --> float (float)10 10.0f

 

* 숫자 65를 char로 형변환 하면 'A'가 나오는 이유는 유니코드 문자로 변환 가능하기 때문이다. 

 

컴퓨터는 문자를 모르고 숫자밖에 모른다. 그래서 문자를 숫자로 바꿔서 저장해야한다. 이 때 아무 숫자로 저장할 수 없고 그 기준이 있는데 그것이 유니코드 문자표이다. 

 

 

유니코드 문자표(출처 - https://whatisthenext.tistory.com/103)

 

 

 


 

 

자동 형변환

 

 

float f = 1234; // int 타입의 값을 float타입의 변수에 저장

// 기본적으로 타입이 다른 값에 대입은 허용하지 않는다. 
// 하지만 위의 코드는 가능하다. 

// 이유는 int는 2*10^9(약 20억)인데 대입하는 float는 10^38로 작은 값을 큰 타입의 변수에 넣어서 문제가 없다.

float f = (float)1234; // 그래도 원래는 형변환이 되야 하지만, 컴파일러가 자동 형변환을 한 것이다. 

// 반대로 값을 넣으면?

int i = 3.14f; // 작은 값에 큰 값을 넣으려 하기 때문에 값 손실이 발생한다. 컴파일러가 자동 형변환을 해주지 못한다.

int i = (int)3.14f // ok, 이렇게 직접 형변환을 해주면 에러가 나지 않는다.

// 1. byte -> int

byte b = 10;
int i = b;    // 자동 형변환 가능 

// 2. int -> byte 
int i2 = 300;
byte b2 = (byte)i2; // 자동 형변환 불가, 직접 형변환 해야한다.

 

 

tip) 값손실이 없으면 빈자리는 0으로 채워진다.

 

자동 형변환 되는 순서

* long -> float : long은 8byte 저장 가능하고 float는 4byte 저장이 가능해서 언뜻 보기에 자동 형변환이 되지 않을 것 처럼 보이지만 표현 범위가 long은 10^19 이고, float는 10^38까지 가능하기 때문에 자동 형변환이 가능하다. 

 

 

// byte타입의 범위(-128 ~ 127)값 대입

byte b = 100; // OK? 아까 분명 큰 값을 작은 값에 넣으면 에러가 난다고 했는데 왜 에러가 나지 않나?

// 이유는 byte 타입으로 자동 형변환 하여 대입 했기 때문이다.
// 분명 작은 타입에서 큰 타입을 넣을 때만 자동 형변환이 된다고 했는데 지금은 큰 타입에서
// 작은 타입으로 대입인데 이게 가능한가?
// 지금의 경우는 예외적으로 가능하다.
// byte타입의 표현 범위는 -128 ~ 127까지인데 100이라는 숫자로 표현되어 있고 컴퓨터는 숫자를 읽을 수 있기 때문에 
// 컴파일러가 값 손실이 나지 않는다는 사실을 알고 있기 때문에 에러가 나지 않는 예외인 경우이다. 

byte b = (byte)100; // 형변환 생략

// 그럼 아래와 같은 경우는 왜 에러인가?

int i = 100;

byte b = i; // error? 위의 경우는 리터럴 타입으로 100을 명확하게 알지만 여기서는 변수로 사용되어 컴파일러가 명확하게 값을 확신할 수 없어서 에러가 난다. 

byte b = (byte)i; // ok, 그래서 수동 형변환을 해야한다. 


byte b = 1000; // error? byte타입의 값 표현 범위를 벗어났기 때문에 에러 

// 리터럴 타입이라고 할지라도 범위를 벗어나면 컴파일러는 자동 형변환을 해주지 않는다.

byte b = (byte)1000; // ok, 그러나 값 손실이 발생해서 변수 b에는 -24가 저장된다.

 

 

 


 

 

[ 자바의 정석 - 기초 유튜브 강의 영상 참고 ]

 

https://www.youtube.com/watch?v=mzC1CGNykL8&list=PLW2UjW795-f6xWA2_MUhEVgPauhGl3xIp&index=26 

 

'Programming Language > JAVA' 카테고리의 다른 글

반올림 Math.round(), 나머지 연산자  (0) 2023.01.16
사칙 연산자, 산술 변환  (0) 2023.01.14
증감 연산자, 부호 연산자  (0) 2023.01.12
연산자의 우선순위  (0) 2023.01.11
연산자와 피연산자  (0) 2023.01.11