형 변환 (캐스팅, Casting) 이란?

변수나 리터럴의 타입을 다른 타입으로 변환하는 것을 형 변환이라고 한다.

형 변환 방법

double d = 85.4;
int score = (int) d;

위와 같이 형 변환 연산자 '()'를 이용하여 변환한다.

변환 과정

double d = 85.4;

int score = (int) d;
int score = (int) 85.4;
int score = 85;

기본형의 형 변환

char c = (char) 65; // int -> char
int i = (int) 'A'; // char -> int
int i = (int) 1.6f; // float -> int
float f = (float) 10; // int -> float

boolean타입은 다른 타입과 형 변환이 안된다.

정수형 간의 형 변환

// 큰 타입 -> 작은 타입
byte b = (byte) 10; // 1010(10) -> 1010(10)
byte b = (byte) 300; // 100101100(300) -> 00101100(44)

// 작은 타입 -> 큰 타입
int i = (int) 10; // 1010(10) -> 1010(10)
int i = (int) -2; // 11111110(-2) -> 111111100(-2)
  • 작은 타입으로 변환할 경우 값의 손실이 발생할 수 있다.
  • 큰 타입으로 변환할 경우 값의 손실이 없다.
  • 변환하고자 하는 값이 양수면 0, 음수면 1을 빈칸에 채워 넣는다.

실수형 간의 형 변환

작은 타입 -> 큰 타입 (float -> double)

  • float의 기저인 127을 빼고 double의 기저인 1023을 더한다.
  • float의 가수 23자리를 채우고 빈칸에 0을 채운다.

큰 타입 -> 자은 타입 (double -> float)

  • double의 기저인 1023을 빼고 float의 기저인 127을 더한다.
  • double의 가수 52자리 중 23자리만 저장하고 나머지는 버린다.

주의점)

  1. 24번째 자리가 1일 경우 반올림이 발생한다.
  2. float 타입의 값을 넘는 경우 ±무한대(큰 경우), ±0(작은 경우)의 결과를 얻는다.

정수형과 실수형 간의 형 변환

저장 방식

정수형의 저장 방식
실수형의 저장 방식

정수형 -> 실수형 변환

10진수 7 (0 | 000...00111) 111 -> 1.11 * 2^2+127 (정규화) (0 | 10000001 | 11000...000)

 

주의점)

int의 최대 값인 약 20억을 변환할 경우 최대 10자리의 정밀도가 필요하다. 큰 값을 변환할 경우 deouble형으로 변환해야 오차가 발생하지 않는다.

 

EX)

int -> float -> int : 9123456 -> 91234568.0 -> 91234568

int -> double -> int : 9123456 -> 91234567.0 -> 91234567

실수형 -> 정수형 변환

정수형은 소수점 이하를 표현할 수 없기 때문에 소수점 이하의 값은 버려진다.

EX)

9.1234567f -> 9

 

float (0 | 10000010 | 001000111111001101011101) -> 1001.001000111111001101011101

int (0 | 0000000....00001001)

 

위의 예시처럼 소수점은 모두 버려진다.

만약 정수로 변환 시 정수의 범위를 넘는다면 오버플로우가 발생한다.

자동 형 변환

  1. 편의상의 이유로 형 변환을 생략할수 있다. 
  2. 형변환을 명시 해주면 의도적인 형 변환으로 간주하여 에러가 발생하지 않는다. 
  3. 서로 다른 타입의 덧셈의 경우 더 큰 범위를 가진 타입으로 자동 형 변환이 이루어져 계산되어 값 손실을 줄이고 올바른 값을 얻는다.

연산자의 범위보다 큰 값을 저장하는 경우 에러가 발생한다. EX) incompatible types: possible lossy conversion from int to byte

 

아래의 예시는 위의 3가지 특징을 보여주는 예시이다.

1. float f = 1234;
2. char c = (char) 100;
3. int i = 3;
   double d = 1.0 + i;
   // double d = 1.0 + (double) i;

자동으로 형 변환하는 것을 산술 변환이라고 한다.

자동 형 변환의 규칙

  • 기존의 값을 최대한 보존할 수 있는 타입으로 자동 변환
  • 표현 범위가 넓은 쪽으로 변환하여 값 손실을 줄인다.
  • char와 short는 같은 2byte지만 값의 범위가 달라 자동 형 변환이 될 수 없다.

자동 형 변환의 타입 나열

// 1byte => 2byte => 4byte => 8byte => 4byte => 8byte

byte  => short => int   => long  => float => double
	  char =>

위의 순서대로 변환 시 자동 변환이 된다.

반대 방향으로 변환시 캐스팅 연산자를 써줘야 한다.

형 변환의 정리

  1. boolean을 제외한 나머지 7개의 기본형은 서로 형 변환이 가능하다.
  2. 기본형과 참조형은 서로 형 변환할 수 없다.
  3. 서로 다른 타입 간의 연산은 형 변환하는 것이 원칙이나 작은 범위에서 큰 범위로 변환 시 캐스팅 연산자 생략 가능하다.

'개발 언어 > Java' 카테고리의 다른 글

[Java] 제어문  (0) 2021.08.18
[Java] 연산자  (0) 2021.08.18
[Java] 실수형의 소수점 표현 방식과 BigDecimal  (0) 2021.08.13
[Java] 오버 플로우, 언더 플로우  (0) 2021.08.12
[Java] 상수와 리터럴  (0) 2021.08.11

+ Recent posts