(Java의 문법이랑 많이 관련되었다기보단, 숫자가 컴퓨터 시스템 상에서 어떻게 저장되는거랑 많이 관련된 내용으로 이해가 잘 안되면 따로 검색해보시길)

형변환 기본

  • 변수/literal을 특정 type으로 변환시키는 것.

  • (타입)literal/변수형태로 하면 된다.

double mean = 85.4;
int meanInt = (int)mean; //85
  • 위에서 봤듯 bit representation 기반 변환인게 아니라, type에 맞게 적절히 변환하는 것이다.

  • 형변환을 당한 변수는 형변환 이후에도 기존의 타입으로 유지된다. 위의 경우 mean은 여전히 double이란 뜻.

  • 정수가 실수로 변환될 시 반올림이 아니라 버림 형태로 변환이 된다.

정수간의 형변환

  • 정수가 더 작은 범위의 정수로 변환이 될 경우 초과된 범위의 bit가 전부 날라간 채로 변환이 된다.
int i = 300;
byte a = (int)i;
System.out.printf("%d", a); //44. Verify this by checking bit representation.
  • 정수가 더 큰 범위의 정수로 변환이 되면 문제 없이 변환이 된다. 내부적으로는 최고 bit가 상위 bit들에 전부 복사된다.

실수간의 형변환

  • 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의 형변환은 이전에 StringString이 아닌 기본형의 덧셈에서 확인했으니 생략한다.

  • boolean의 경우 String으로만 형변환이 가능하다. ("true", "false")

  • 참조형의 경우 기본형으로 형변환이 안된다. 단 참조형이 null인 경우 String으로 형변환이 가능하다. ("null"로 변환된다. 좋은건 아니다....) 기본형은 참조형으로 형변환이 안된다.

profile
안 흔하고 싶은 개발자. 관심 분야 : 임베디드/컴퓨터 시스템 및 아키텍처/웹/AI

0개의 댓글

Powered by GraphCDN, the GraphQL CDN