참고
자바의 정석
형변환 (casting)이란?
- 형변환이란, 변수 또는 상수의 타입을 다른 타입으로 변환하는 것
형변환 방법
- 형변환 방법은 형변환하고자 하는 변수나 리터럴의 앞에 변환하고자 하는 타입을 괄호와 함꼐 붙여준다.
(타입) 피연산자
- 이때, ()를 캐스트 연산자 또는 형변환 연산자라고 하며, 이런 행위를 캐스팅이라고 한다.
double d = 85.4;
int score = (int) d;
- 여기서 피연산자 d의 값은 형변환 후에 아무런 변화가 없다.
- 기본형에서, boolean형을 제외한 나머지 타입들은 서로 형변환이 가능하다.
그리고 기본형과 참조형간의 형변환은 불가능하다.
- 참고로, 실수형타입의 값을 정수형으로 변환할 때, 소수점은 반올림이 아닌 버림인것을 주의 바란다.
정수형간의 형변환
- 큰 타입에서 작은 타입으로 변환 (ex. int -> byte)은 경우에 따라서
값의 손실이 발생할 수 있다.
- 반대로, 작은 타입에서 큰 타입으로 변환 (ex. byte -> int)은 저장공간 부족으로 잘려나갈 일은 없고, 나머지 빈공간은 양수면 0, 음수면 1로 채워진다. 음수 일때, 1로 채워지는 경우는 형변환 후에도 부호를 유지할 수 있기 위해서이다.
실수형간의 형변환
- 실수형에서도 정수형처럼 작은 타입에서 큰 타입으로 변환하는 경우, 빈 공간을 0으로 채운다. float에서 double로 변환하는 경우는 지수부에서 float의 기저인 127을 뺀 후, double의 기저인 1023을 더해서 변환하고, 가수는 float의 가수 23자리를 채우고 나머지는 0으로 채운다.
- 반대로 변환하는 경우는 지수부는 double의 기저인 1023을 빼고 float의 기저인 127을 더하고, 가수부는 52자리중 23자리만 저장되고 나머지는 버려진다.
- 참고로, 주의할 점은 가수의 24번째 자리에서 반올림이 발생 할 수 있는 것이다. 24번째 자리의 값이 1이면, 반올림이 발생하여, 23번째 자리의 값이 1이 증가한다.
- 그리고 float 타입의 범위를 넘는 값을 형변환 할려는 경우는 양 혹은 음의 무한대 또는 0이 나올수 있다.
정수형과 실수형간의 형변환
- 정수형과 실수형은 저장형식이 완전히 다르기 때문에 조금 복잡하다.
정수형을 실수형으로 변환
- 정수를 2진수로 변환한 다음에, 정규화 과정을 거치면 된다.
- 주의할 점은 실수형의 정밀도 제한으로 인한 오차가 발생할 수 있다.
실수형을 정수형으로 변환
- 실수형을 정수형으로 변환하면, 실수형의 소수점 이하 값은 버려진다. 정수형의 표현식으로 소수점 이하의 값은 표현할 수 없기 때문이다.
자동 형변환
- 서로 다른 타입간의 대입 및 연상을 할 때는 반드시 형변환을 하는게 원칙이지만, 경우에 따라 편의상 이유로 형변환을 생략할 수 있다. 컴파일러가 자동으로 해주는 경우가 있다.
float f = 1234;
- 그러나 무작정 생략하는것이 아니다. 타입이 저장할 수 있는 범위보다 리터럴 범위가 더 큰 경우 에러가 발생하기 때문이다.
byte b = 1000;
- 위와 같은 경우 값의 손실이 일어났다고 컴파일러가 개발자에게 알려주는 것이다.
- 명시적으로 형변환 해주면 에러가 발생하지 않는다.
char ch = (char) 1000;
int i = 3;
double d = 1.0 + i;
자동 형변환의 규칙
- 기존의 값을 최대한 보존할 수 있는 타입으로 자동 형변환이 가능하다.
- 즉, 표현범위가 좁은 타입에서 넓은 타입으로 형변환 하는 경우에는 값 손실이 없으므로 두 타입중, 표현범위가 더 넓은 쪽으로 형변환이 가능하다.
정리
1. boolean을 제외한 나머지 7개의 기본형은 서로 형변환이 가능하다.
2. 기본형과 참조형은 서로 형변환 할 수 없다.
3. 서로 다른 타입의 변수간의 형변환을 하는 것이 원칙이지만,
값의 범위가 작은 타입에서 큰 타입으로의 형변환은 생략이 가능하다.