강제 타입 변환
- 큰 타입을 작은 타입 단위로 쪼개고 끝 한부분만 작은 타입으로 강제적 변환
이 말에서 어려운 점이 끝 한부분만 작은 타입으로 강제적 변환이였는데 쉽게 이해는 가능하나 어렵다
예) int intValue = 103029770;
byte byteValue = (byte)intValue;
값) 10이 나온다
값이 보존 안되는 타입
※ 여기서 왜 int값이 byte로 강제적변환(Casting)을 했을 때 왜 값이 이상하게 나오지 하는 의문이 들었습니다. 하지만 전에 배운걸 들여다보면 byte의 데이터 값은 -128~127일 뿐이다. 그리고 끝 한부분이 십진수의 제일 안쪽 끝 부분만 이야기를 한거를 알 수 있었다... 십진수를 해보면 알 수 있다
※ 00000110 00100100 00011100 00001010 ->103029770을 십진수로 나열 저 끝 부분이 00001010 이다.
!!! 강제 타입이 되더라도 값은 보존하는게 좋다
int intValue1 = 65;//65대신 'A' 넣어도 값은 값다
char charValue = (char)intValue1;
System.out.println(charValue); //값 A
long longValue = 300;
int intValue2 = (int) longValue;
System.out.println(intValue2); //값 300
double doubleValue = 3.14;
int intValue3 = (int)doubleValue; //int는 정수라서 정수부분만 저장
System.out.println(intValue3); //값 3
- 강제 타입 변환전에 값이 보존될 것인지(손실이 되지 않는지) 검사
예) int i =128;
if ((i<Byte.MIN_VALUE) || (i>Byte.MAX_VALUE)) { // i<-128 || i>127
System.out.println("byte 타입으로 변환할 수 없습니다");
System.out.println("값을 다시 확인해 주세요");
} else {
byte b = (byte)i;
System.out.println(b);
}
값은) byte 타입으로 변환할 수 없습니다
값을 다시 확인해 주세요
기본 타입 | 최대값 상수 | 최소값 상수 |
byte | byte.MAX_VALUE | byte.MIN_VALUE |
short | short.MAX_VALUE | short.MIN_VALUE |
int | int.MAX_VALUE | int.MIN_VALUE |
long | long.MAX_VALUE | double.MIN_VALUE |
float | float.MAX_VALUE | double.MIN_VALUE |
double | double.MAX_VALUE | double.MIN_VALUE |
- 강제 타입 변환시 정밀도 손실을 피한다.(정수 타입을 실수 타입으로 변환할 때)
예) int num1 = 123456780;
int num2 = 123456780;
float num3 = num2;
num2 = (int)num3;
int result = num1 - num2;
System.out.println(result);
//값은? -4
위 예시는 int 타입이 float 타입으로 값을 변환하는 강제 변환이다 . 하지만 값이 0이 나와야되는데 0이 아니고 다른 값이 나온다.
다른 값이 나오는 이유는 float의 가수 표현이다. int는 32비트인데 float의 가수는 23bit라서 근사치로 변환된다.
float : 부호(1비트) + 지수(8비트) + 가수(23비트)
※ 실수타입 변환은 float보다 double이 좋다. 어떠한 값이라도 안전하고 정밀도 손실없이 변환할 수 있다.(실수에서는 double을 많이 쓴다)
예) int num1 = 123456780;
int num2 = 123456780;
double num3 = num2;
num2 = (int)num3;
int result = num1 - num2;
System.out.println(result);
//값은? 0
위 예시는 int 타입이 double 타입으로 값을 변환하는 강제 변환(손실 없이 변환 된다.)
int의 32비트가 double 가수 52비트보다 낮긴때문에 가능하다.
double : 부호(1비트) + 지수(11비트) + 가수(52비트)
예) int intValue = 10;
double doubleValue = 5.5;
int result1 = intValue +(int)doubleValue;
System.out.println(result1); //int는 정수값이라서 소수값이 사라짐
//값)15
char ai = 'A';
int result2 = ai + 1; //A는 65이다
char na = (char)result2;
System.out.println(na);//char 강제변환해서 나타낸 문자
//값)B
'자바공부 > 변수와 타입' 카테고리의 다른 글
JAVA(자바)-타입 변환 중에 자동 타입 변환 (0) | 2020.12.04 |
---|---|
JAVA(자바)-데이터 타입 (0) | 2020.11.29 |
JAVA(자바)-리터럴(literal) (0) | 2020.11.28 |
JAVA(자바)-변수 (0) | 2020.11.27 |