형변환이란?
변수나 리터럴의 타입을 다른 타입으로 변환하는 것을 형변환이라 한다.
형변환 방법
(타입)피연산자
ex) double d = 85.4;
int score = (int)d;
기본형에서 boolean을 제외한 모든 타입들은 서로 형변환이 가능하다. 또한, 기본형과 참조형간의 형봔한은 불가능하다.
기본형 형변환
변환 | 수식 | 결과 |
---|---|---|
int → char | (char)65 | 'A' |
char → int | (int)'A' | 65 |
float → int | (int)1.6f | 1 |
int → float | (float) 10 | 10.0f |
정수형간의 형변환
int타입(4byte)의 값을 byte타입으로 변환하는 경우 값손실이 발생할 수 있다. 반대로 작은 타입에서 큰 타입으로 변경할 경우 값손실이 발생하지 않는다.
실수형 간의 형 변환
실수형에서도 정수형처럼 작은 타입에서 큰 타입으로 변환하는 경우, 빈 공간을 0으로 채운다.
ex)
double d = 1.0e100;
float f = (float)d;
double d = 1.0e-50;
float f = (float)d;
정수형과 실수형 간의 형변환
정수형과 실수형은 저장형식이 다르기에 정수형간의 변환처럼 간단히 값을 채우고 자르는 식으로 할 수 없다. 좀 더 복잡한 단계를 거춰야한다.
정수는 소수점 이하의 값이 없으므로 비교적 변환이 간단하다. int값을 각각 float과 double로 변환한 다음에 다시 int로 형변환 했을 경우 값의 변환이 보인다. float은 정밀도가 약 7자리 이기에 8자리가 넘어가는 정수를 저장할 경우 오차가 발생한다. 반면 double은 약 15자리의 정밀도를 갖기에 float보다 더 큰 범위가 오차없이 적용이 가능하다.
실수형을 정수형으로 변환
실수형을 정수형으로 변환하면 실수형의 소수점이하 값은 버려진다. 정수형의 표현형식으로 소수점 이하의 값은 표현할 수 없기 때문이다. 따라서 실수형을 정수형으로 형변할 할 때 반올림이 발생하지 않는다. 실수 1.666을 int형식으로 변환시 1이 된다.
자동형변환
float f = 1234; → 컴파일 과정 float f = (float)1234;
자동 형변환에는 규칙이 존재한다. 표현범위가 좁은 타입에서 넓은 타입으로 현변환하는 경우에는 값 손실이 없으므로 두 타입중에서 표현범위가 더 넓은 쪽으로 형변환된다.
- boolean을 제외한 나머지 7개의 기본형은 서로 형변환이 가능하다.
- 기본형과 참조형은 서로 형변환 할 수 없다.
- 서로 다른 타입의 변수간의 연산은 형 변환을 하는 것이 원칙이지만, 값의 범위가 작은 타이베서 큰 타입으로의 형변환은 생략할 수 있다.
출처 : JAVA의 정석 - (남궁성지음)