타입변환이란?
: 데이터 타입을 다른 데이터 타입으로 변환하는 것
- 자동(묵시적) 타입 변환
- 강제(명시적) 타입 변환
자동 타입변환
: 컴파일러가 알라서 변환을 해준다.
- 작은 크기를 가지는 타입이 큰 크기를 가지는 타입에 저장될 때 발생
메모리 크기 순서 : byte(1) < short(2) < int(4) < long(8) < float(4) < double(8)
* char은 음수가 없어서(정수일 때만 가능) 자동 변환은 안되고 강제변환을 해주어야 한다.
* float 는 표현할 수 있는 값의 범위가 int 보다 크다.
: 자동 타입 변환이 발생되면 변환 이전의 값과 변환 이후의 값은 동일하다.
: 정수 타입이 실수 타입으로 변환 되는 것은 무조건 자동타입변환이 된다. (but 정수값이 아닌 .0이 붙은 실수값이 된다.)
- int 에서 double 로 변환
1 2 | int intValue = 20; double doubleValue = intValue; // 20.0 | cs |
- char 에서 int 로 변환
1 2 3 | char charrValue = 'A'; int intValue = charrValue; //65 | cs |
강제 타입 변환
: 강제적으로 큰 데이터를 작은 데이터 타입으로 쪼개어서 저장하는것 (캐스팅 : Casting)
- 캐스팅 연산자() 를 사용하는데 괄호 안에 들어가는 타입은 쪼개는 단위이다.
- int 에서 byte 로 강제 변환
1 2 | int intValue = 103029770; byte byteValue = (byte) intValue; //10 | cs |
- double 에서 int 로 강제 변환
1 2 | double doubleValue = 3.14; int intValue = (int) doubleValue; //3 | cs |
: 실수 타입은 정수타입으로 자동변환 되지 않기 때문에 강제 타입변환을 사용한다.
- 소수점 이하 부분은 버려지고, 정수 부분만 저장된다.
* 강제 타입 변환시 값의 손실이 발생하면 안된다.
어떤 정수값과 실수값을 다른 타입으로 변환하고자 할 때는 변환될 타입의 최소값과 최대값을 벗어나는지 반드시 확인하고 만약 벗어난다면
타입변환을 하지 말아야 한다.
기본타입 |
최대값 상수 |
최소값 상수 |
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 |
<변환시 값 확인방법 : 위의 표를 참고>
1 2 3 4 5 6 7 8 9 | int i = 129; if((i<Byte.MIN_VALUE) || (i>Byte.MAX_VALUE)){ System.out.println("byte 타입으로 변환 할 수 없습니다."); System.out.println("값을 다시 확인해 주세요"); } else{ byte b = (byte)i; System.out.println(b); } | cs |
1 2 3 4 5 6 7 8 | int num1 = 123456780; int num2 = 123456780; float num3 = num2; //1.23456784E8 num2 = (int) num3; // 123456784 int result = num1 - num2; //-4 | cs |
- float 타입은 23비트로 표현 할수 없기 때문에 근사치로 계산된다. 즉 정밀도 손상이 있다.
이때는 doubledmf 을 사용하여 정밀도 손상없이 타입 변환이 가능하다.
1 2 3 4 5 6 7 8 | int num1 = 123456780; int num2 = 123456780; double num3 = num2; //1.2345678E8 num2 = (int) num3; // 123456780 int result = num1 - num2; //0 | cs |