타입 변환 : 데이터 타입을 다른 데이터 타입으로 바꾸는 것.
- 자동 타입 변환(Promotion)
: 프로그램 실행 중에 자동으로 타입 변환이 일어나는 것을 의미한다.
큰 크기의 타입 ← 작은 크기의 타입
* 여기서 크기는 사용하는 메모리 크기(바이트 수)를 말한다.
즉, byte ▶ short ▶ int ▶ long ▶ float ▶ double 순서 또는 char ▶ int 순서로 자동 타입 변환이 일어난다.
참고로 long(8 byte)이 float(4 byte)보다 크지만 표현할 수 있는 숫자의 범위가 float이 더 크기때문에 float이 더 큰 타입으로 표시된 것이다. 또한, 정수 타입이 실수 타입으로 변환될 경우 자연수 뒤에 소수점과 소수점이하가 표시된다.
int i = 200;
double d = i; // 이때 d는 200.0이 된다.
자동 타입 변환에서는 딱 한 가지 예외가 있는데, char는 2 바이트의 크기를 가지지만 char의 범위는 0~65535이므로 음수가 저장될 수없다. 즉, 음수가 저장될 수 있는 byte 타입은 char 타입으로 자동 변환시킬 수 없다.
Q) 데이터 손실 유무는 ?
A) 변환 이전의 값은 변환 이후에도 그대로 보존된다. 쉽게 말하자면 작은 양동이의 물을 큰 양동이로 옮긴다고 해도 물의 양은 변하지 않는 것과 같은 것이다.
- 강제 타입 변환(Casting)
: 큰 데이터 타입을 작은 데이터 타입으로 쪼개어 강제로 저장하는 것을 의미한다.
큰 크기의 타입 → 작은 크기의 타입
즉, byte ◀ short ◀ int ◀ long ◀ float ◀ double 순서 또는 char ◀ int 순서로 강제 타입 변환이 일어난다.
# 사용 방법
작은 크기 타입 = (작은 크기 타입) 큰 크기 타입;
int i = 214748364;
byte b = (byte) i;
위의 경우 끝의 1 byte만 byte 타입 변수에 담게 된다. 즉, 변환되어질 데이터(작은 크기의 타입)보다 큰 것을 강제 타입 변환을 할 때 기존의 값은 보존되지 않는다.
# 주의 사항
int -> float으로 강제 타입 변환을 할 때,
float : 부호(1비트) + 지수(8비트) + 가수(32비트)
로 구성되어 있기 때문에 int 값이 123456780 처럼 가수 23비트로 표현불가능한 숫자일 경우 근사값으로 변환된다. 이 점은 정밀도 손실을 발생시키기 때문에 모든 int값을 안전하게 실수 타입으로 변환시키려면 double 타입을 사용하는 것이 현명하다.
double : 부호(1비트) + 지수(11비트) + 가수(52비트)
그 이유는 int값은 4바이트 = 32비트 이므로 double의 가수 52비트보다 항상 작기 때문에 정밀도 손실없이 변환이 가능하다.
헷갈린다면 다른 타입으로 강제 타입 변환 시 변환될 타입(작은 크기의 타입)의 최대값과 최소값을 넘어가는지 확인하면 된다.
아래는 기본타입의 최대값과 최소값을 나타낸 표이다.
기본 타입 |
최대값 상수 |
최소값 상수 |
byte |
Byte.MAX_VALUE |
Byte.MIN_VALUE |
short |
Short.MAX_VALUE |
Short.MIN_VALUE |
int |
Integer.MAX_VALUE |
Integer.MIN_VALUE |
long |
Long.MAX_VALUE |
Long.MIN_VALUE |
float |
Float.MAX_VALUE |
Float.MIN_VALUE |
double |
Double.MAX_VALUE |
Double.MIN_VALUE |
'Programming Language > JAVA' 카테고리의 다른 글
6. About Java and Exception - 예외 (0) | 2017.03.31 |
---|---|
5. Control Statement, Looping - 제어문과 루핑(조건문과 반복문) (0) | 2017.03.23 |
4. Operator and Precedence - 연산자와 우선 순위 (0) | 2017.03.23 |
2. Variable, Constant, Type - 변수, 상수, 자료형 (0) | 2017.03.21 |
1. Java virtual machine - 자바 가상 기계 (0) | 2017.03.21 |