(Java의 문법이랑 많이 관련되었다기보단, 숫자가 컴퓨터 시스템 상에서 어떻게 저장되는거랑 많이 관련된 내용으로 이해가 잘 안되면 따로 검색해보시길)
변수/literal을 특정 type으로 변환시키는 것.
(타입)literal/변수
형태로 하면 된다.
double mean = 85.4;
int meanInt = (int)mean; //85
위에서 봤듯 bit representation 기반 변환인게 아니라, type에 맞게 적절히 변환하는 것이다.
형변환을 당한 변수는 형변환 이후에도 기존의 타입으로 유지된다. 위의 경우 mean
은 여전히 double
이란 뜻.
정수가 실수로 변환될 시 반올림이 아니라 버림 형태로 변환이 된다.
int i = 300;
byte a = (int)i;
System.out.printf("%d", a); //44. Verify this by checking bit representation.
float
-> double
의 경우 float
의 기저인 127 (Exponential의 bit가 8이어서 그렇다.)을 float
숫자의 Exponential에서 뺀 후, double
의 기저인 1023 (Exponential의 bit가 11이어서 그렇다.)을 더한 후 float
의 Mantissa를 0을 붙이면서 extend 하는 형태로 변환한다.
double
->float
의 경우 float
의 가용 범위 안에 들어가는 경우 double
의 기저인 1023을 double
의 Exponential에서 뺀 후, float
의 기저인 127을 더한 후 double
의 Mantissa를 float
Mantissa의 길이만큼만 상위부터 남기고 나머지를 버린다. 단, 버려진 Mantissa의 상위 bit가 1인 경우 남겨진 Mantissa에 1을 더한다.
double
-> float
인데 float
가용 범위에 들어가지 않으면 inf
나 -inf
나 +0
이나 -0
이 나온다.
먼저 정수를 실수형으로 변환한다. 실수의 정규 표현법으로 변환한 다음에 저장을 하면 되는데 자세한건 이 링크 참고.
가용범위는 실수가 보통 정수보다 많으나, 그렇다고 모든 정수를 실수가 정확하게 저장할 수 있다는 뜻은 아니다. 실수를 이산적으로 저장하기 때문에 모든 정수값을 온전히 표현하긴 힘들기 때문.
실수를 정수형으로 변환시, 소수 부분에 해당하는 숫자는 버려지고 정수 부분의 숫자만 남겨지게 된다.
implicit type casting이라고도 불린다.
처음 설명한 형변환은 직접 형변환을 명령하기에 explicit type casting이라고도 불린다.
프로그래머의 편의를 위해 컴파일러가 형변환을 자동으로 추가해주는 기능.
float f = 1234;
/* compiler makes following code
float f = (float)1234; */
이전에 범위를 벗어나는 숫자를 바로 할당하려 하면 오류가 발생하는걸 봤다. 즉 범위를 벗어나는 숫자에 대해서는 자동 형변환을 하지 않는다.
하지만 명시적 형변환을 하면 범위를 벗어나는 숫자도 저장이 가능하다.
char ch = (char) 58342; //OK
int i = 3;
double d = 1.0 + i; //1.0 + (double)i
정수여도 type이 다른 애들끼리 계산이 될 수 있다. 이 경우 표현력이 더 높은 정수로 형변환이 된다.
실수여도 type이 다른 애들끼리 계산이 될 수 있다. 이 경우 표현력이 더 높은 실수 (double
) 로 형변환이 된다.
단 이는 최종 결과물이 더 큰 형변환이 이루어졌을 때 이를 포함할 수 있는 경우에만 해당되며, 그렇지 않은 경우 명시적 형변환을 해야 한다.
int i = 3;
short a = 2 + (short)i;
String
의 형변환은 이전에 String
과 String
이 아닌 기본형의 덧셈에서 확인했으니 생략한다.
boolean의 경우 String
으로만 형변환이 가능하다. ("true"
, "false"
)
참조형의 경우 기본형으로 형변환이 안된다. 단 참조형이 null
인 경우 String
으로 형변환이 가능하다. ("null"
로 변환된다. 좋은건 아니다....) 기본형은 참조형으로 형변환이 안된다.