타입 변환이란 데이터 타입을 다른 데이터 타입으로 변환하는 것을 말한다.
기본형과 참조형 모두 형변환이 가능하지만, 기본형과 참조형 사이에는 형변환이 성립되지 않는다.
일반적으로 값의 허용 범위가 작은 타입이 허용 범위가 큰 타입으로 저장될 때 발생하며 컴파일러가 생략된 형변환을 자동적으로 해준다.
타입을 변경해도 정보의 손실이 일어나지 않는 경우 자동 형 변환이 일어난다.
기본 타입 허용 범위 크기 비교(boolean은 제외)
byte(1) < short(2), char(2) < int(4) < long(8) < float(4) < double(8)
char cha = 'A';
int target = cha;
//문자가 정수로 자동 형변환될 때는 문자의 유니코드 값이 저장
System.out.println(target); //출력: 65
예외! long(8) -> float(4) : 가능
float가 long보다 표현할 수 있는 값의 범위가 더 커서 형변환이 가능하다.(부동소수점 참고)
long longValue = 100;//long 8
float floatValue = longValue;//float 4
//정수타입이 실수 타입으로 저장될 경우 무조건 자동 형 변환
System.out.println(floatValue); //출력: 100.0
예외! byte(1) -> char(2) : 에러
char 타입의 허용 범위(0~65535)에 음수를 포함하지 않아서 작은 타입에서 큰 타입으로의 변환이어도 에러가 난다. (byte 타입은 음수를 포함)
byte byteByte = 64;
char charChar = byteByte; //Type mismatch error
허용 범위가 큰 타입은 허용 범위가 작은 타입으로 자동 타입 변환이 될 수 없어서,
허용 범위가 큰 타입에서 허용 범위가 작은 타입으로 강제로 나눠서 저장해야 한다.
강제 타입 변환은 캐스팅 연산자()를 사용한다.
(타입이름) 피연산자
캐스팅 연산자( )
캐스팅 연산자는 결과로 피연산자의 값을 지정한 타입으로 변환 후 반환하며(캐스팅 연산자는 우선순위가 매우 높다), 이 때 일어나는 형변환은 피연산자의 원래 값에 영향을 미치지 않는다.
int intValue = 1;
byte byteValue = (byte) intValue;
short shortValue = (short) intValue;
System.out.println(byteValue);// 출력: 1
System.out.println(shortValue);// 출력: 1
주의! 특정 변수의 최대 값은 얼마인지 확인
형변환만 했을 뿐, 서로 동일한 값이 나오지 않을 경우를 생각해야 한다.
double doubleDouble = 3.33;
int intInt = (int) doubleDouble;
//실수 타입은 소수점 이하부분은 버려지고 정수 부분만 저장한다
System.out.println(intInt);// 출력: 3