본문 바로가기
자바공부/변수와 타입

JAVA(자바)-타입 변환 중에 강제 타입 변환

by You진 2020. 12. 10.

강제 타입 변환

 - 큰 타입을 작은 타입 단위로 쪼개고 끝 한부분만 작은 타입으로 강제적 변환

 이 말에서 어려운 점이 끝 한부분만 작은 타입으로 강제적 변환이였는데 쉽게 이해는 가능하나 어렵다

예)		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