java promotion casting
java promotion casting 지난 글에서 자바 형변환의 기본 개념에 대해서 정리를 해봤었는데요. 이번에는 조금 신경을 써야 하는 형변환의 특별한 경우를 정리해볼까 합니다. 작은 녀석을 큰곳에 담는걸 프로모션(Promotion)이라고 하며 데이터의 손실이 없는 형변환이고 반대로 큰 데이터를 작은 곳으로 옮겨 담으면서 담을 자료형을 괄호로 입력해서 데이터의 손실이 있을 수 있음을 시스템에게 알려주는 방법을 캐스팅(Casting)이라고 정리했었는데요. 다음의 경우 둘 중 어떤 변환에 속할까요?
public class Test { public static void main(String[]ar){ short aa=30; char bb=aa; } }
이 경우 2byte의 short 데이터를 2byte의 char에 대입하고 있는데 프로모션 같지만 캐스팅입니다. 이유는 같은 크기의 자료형이라고 해도 char는 Unsigned이기 때문에 음수를 포함하지 못 합니다. 그렇기 때문에 음수를 포함한느 short을 대입하기 위해서는 캐스팅을 해야 하며 이를 시스템에 알려주기 위해서 마지막 문장에 데이터가 손실될 수도 있다고 알려주기 위해서 다음과 같이 괄호를 이용해서 자료형을 입력해줘야 합니다. char bb=(char)aa; 정수형에는 이 부분만 주의하면 되고요.
다음은 실수와 정수의 관계를 정리해겠습니다. long은 정수중에서 가장 큰 공간을 사용하는 8byte입니다. 그리고 float는 4byte의 공간을 사용하는 실수형입니다. 누가 봐도 당연히 long이 큰 자료형이라서 다음과 같이 float이 데이터를 long에 저장하는 것은 프로모션 같습니다.
public class Test { public static void main(String[]ar){ float x=123.45f; long y=x; } }
하지만 위 예제에서는 에러가 발생합니다. 분명히 long이 float보다 큰데 왜 그럴까요? 그건 소수점까지 표시할 수 있는 실수의 특징 때문인데요. 소수점 이하를 표시하지 못하는 long안에 실수를 저장하게 되면 소수점 이하는 손실되기 때문에 작은 녀석을 큰 곳에 담는다고 해도 캐스팅이 됩니다. 즉, 실수와 정수 중에서는 실수가 무조건 크며 자료형을 변환할 때 무조건 캐스팅이 된다고 생각하시면 됩니다. 에러를 해결하기 위해서는 long y=(long)x;와 같이 괄호에 자료형을 입력해서 캐스팅의 형식을 갖추어야 합니다.
이렇게 해서 java 형변환 중에서 조금 특이한 케이스를 살펴봤는데요. 정리를 하자면 같은 자료형이라고 음수를 담지 못하는 char로 형변환이 이루어지면 음수를 잃게 되므로 캐스팅이며, 실수를 정수에 담을 때도 역시 소수점 이하의 데이터를 잃게 되므로 캐스팅이 됩니다.