반응형

# 형 변환(캐스팅, casting)

  • 변수나 리터럴의 타입을 다른 타입으로 변환하는 것.

## 형 변환 방법

(타입)피연산자

=> double 타입의 변수를 int 타입으로 변환하는 예.
double d = 85.7;
int score = (int)d;
  • 형 변환하고자 하는 변수나 리터럴의 앞에 변환하고자 하는 타입을 괄호와 함께 붙임.
  • 형 변환에서 사용되는 괄호를 캐스트 연산자 or 형변환 연산자라고 한다. (형 변환 = 캐스팅)
  • 형 변환 연산자 : 단순히 피연산자의 값을 읽어 지정된 타입으로 형 변환, 해당 결과를 반환. (피연산자의 변수 값은 형변환 후에도 아무런 변화가 없음)
  • 기본형에서 boolean 타입을 제외한 나머지 타입들은 서로 형변환이 가능하다. (기본형과 참조형 간의 형 변환은 불가능)
변환 수식 결과
int > char (char) 65 'A'
char > int (int) 'A' 65
float > int (int) 1.6f 1
int > float (float) 10 10.0f
  • float 타입 int 변환 시 소수점 이하 값 '버림 처리'

 

1. 정수형 값 형 변환

  • 큰 타입 > 작은 타입으로 변환 시, 경우에 따라 '값 손실(loss of data)' 발생 가능. (저장 공간의 부족으로 발생)
  • 작은 타입 > 큰 타입으로 변환 시, 값 손실 없음. (나머지 빈 공간은 0 or 1로 채워진다. -> 보통 0으로 채우는 게 보통이지만, 값이 음수인 경우 1로 채운다. 이는 형 변환 후에도 부호를 유지할 수 있도록 하기 위함이다.)
1. int > byte
i = 10 > b = 10

2. int > byte
i = 300 > b = 44

3. byte > int
b = 10 > i = 10

4. byte > int
b = -2 > i = -2

5. Integer.toBinaryString(int i)
i = 11111111111111111111111111111110

 

2. 실수형 간 형 변환

  • 작은 타입 > 큰 타입 변환 시, 빈 공간을 0으로 채움

 

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

  • 정수형을 실수형으로 변환 시, 정수는 소수점 이하의 값이 없으므로 비교적 변환이 간단. (정수를 2진수로 변환 후 정규화를 거쳐 실수의 저장형식으로 저장)
  • 실수형은 정수형 보다 큰 저장범위를 갖기 때문에 무리가 없지만, 실수형의 정밀도의 제한으로 오차가 발생할 수 있다.
  • 실수형을 정수형으로 변환 시, 실수형의 소수점 이하 값은 버려진다. (정수형의 표현 형식으로는 소수점 이하의 값을 표현할 수 없기 때문) 만약 실수의 소수점을 버리고 남은 정수가 정수형의 저장범위를 넘는 경우에는 정수의 오버플로우가 발생한 결과를 얻는다.

 

4. 자동 형 변환

  • 서로 다른 타입간의 대입 or 연산 시 형 변환으로 타입을 일치시키는 것이 원칙이나, 경우에 따라 편의상의 이유로 형 변환 생략 가능. 이때 컴파일러가 생략된 형변환을 자동적으로 추가한다.
  • 컴파일러는 '기존의 값을 최대한 보존할 수 있는 타입으로 자동 형변환 한다.'
  • 표현 범위가 좁은 타입 > 넓은 타입으로 형 변환하는 경우 값 손실이 없으므로 표현 범위가 넓은 쪽으로 형변환 된다.
  • 보통 자료형의 크기가 큰 것일수록 값의 표현범위가 크지만, 실수형은 정수형과 값을 표현하는 방식이 달라 같은 크기라도 실수형이 정수형보다 더 큰 표현 범위를 갖는다.

기본형 자동 형변환 가능한 방향

## 정리

  • boolean 제외한 나머지 7개의 기본형은 서로 형변환 가능
  • 기본형과 참조형은 서로 형변환 불가
  • 서로 다른 타입의 변수간 연산은 형변환을 하는 것이 원칙, 값의 범위가 작은 타입에서 큰 타입으로의 형변환은 생략 가능
반응형

+ Recent posts