백기선님의 자바 라이브 스터디 2주차 주제 중 '타입 변환, 캐스팅 그리고 타입 프로모션'에 대해서 정리해봅니다.
타입 변환에 대해서는 어렴풋이 알고 있지만 캐스팅, 프로모션이라고 표현하니까 처음 듣는 듯한 느낌이 드는군요. 흔히 알고 있을 용어로 표현하자면 명시적 형변환(캐스팅)과 자동 형변환(프로모션)에 대한 내용입니다.
타입 캐스팅(명시적 형변환)
타입 캐스팅의 경우 데이터 크기가 큰 쪽에서 작은 쪽으로 강제로 변환시킬 때 사용됩니다. 4바이트인 int형에서 1바이트인 byte형으로 바꾸고 싶은 경우가 이에 해당합니다.
int a = 3;
byte b = (byte)a;
위의 코드처럼 int형 a를 byte형으로 수정하고 싶으면 괄호 치고 타입 이름을 적어 넣으시면 됩니다.
다만 주의할 점이 있는데요. 데이터 크기가 큰 쪽에서 작은 쪽으로 옮기다 보니 데이터 손실이나 변형이 있을 수 있습니다. 사실 그러한 이유로 타입 캐스팅을 해주지 않으면 특정 에러 메시지를 보이게 되죠.
error: incompatible types: possible lossy conversion ( 에러메시지 예시)
정수형 -> 정수형, 실수형 -> 실수형 뿐만이 아니라 실수형 -> 정수형도 가능합니다. 이 경우에는 소수점 아래 부분은 짤리기도 합니다.
타입 프로모션
데이터 표현 범위가 큰 -> 작은 쪽으로 변환이 아니라면, 데이터 손실이나 변형의 위험이 없어서 자동으로 형변환을 해줍니다.
byte a = 3;
int b = a;
byte -> int 인 경우 데이터 표현 범위 안에 들어오므로(매우 당연) 자동 형변환이 이뤄집니다. 허나 여기서도 예외는 있습니다. byte -> char의 경우 에러가 발생합니다. byte는 음수도 표현이 가능한 반면 char는 불가능해서 그런데요.. 타입의 사이즈에 따라서 크다, 작다보다는 해당 타입이 담을 수 있는 데이터 범위를 다 담을 수 있는 지의 여부로 판별하시는게 적절해보입니다.
참조형 타입 변환
부모 클래스와 자식 관계가 곁들여지는 참조형의 경우에는 어떨까요?? Car라는 부모 클래스가 있고 람보르기니라는 자식 클래스가 있다고 생각해볼게요. 부모 클래스에는 모든 Car들에 대한 공통 사항들이 있겠고, 람보르기니는 람보르기니만의 무언가가 더해져 있겠죠. 그렇다면 람보르기니가 표현하는 데이터가 더 많기에(Car 클래스에 있는 데이터 포함) 람보르기니 -> Car는 자동 형변환이 되지만 Car -> 람보르기니면 타입 캐스팅을 해주셔야 합니다.
'Java' 카테고리의 다른 글
[JAVA] 자바 연산자에 대하여 (0) | 2021.04.10 |
---|---|
[JAVA] 배열 선언하기 및 타입 추론 (0) | 2021.04.09 |
[JAVA] 자바 변수 스코프와 라이프타임 (0) | 2021.04.07 |
[JAVA] 자바 원시 타입 (0) | 2021.04.05 |
[JAVA] JDK와 JRE의 차이 (0) | 2021.04.04 |