녕의 학습 기록

[Java] 타입변환 본문

Dev/Java

[Java] 타입변환

kjyyjk 2022. 6. 25. 20:46

타입변환에는 두가지 종류가 있다.

 

묵시적(자동) 타입변환, 그리고 명시적(강제) 타입 변환이다.

 

자동 타입 변환

자동 타입 변환은 메모리의 크기가 작은 타입이 큰 크기의 타입에 저장될 때 발생한다.

먼저 크기별로 정수 및 실수 타입을 정리하자면 다음과 같다.

 

byte(1) < short(2) < int(4) < long(8) < float(4) < double(8)

* float는 4 바이트 이지만 long과 int보다 표현할 수 있는 범위가 크다.

 

자동 타입 변환이 발생되면 전과 후의 값은 동일하다. 

 

int intValue = 200;

double doubleValue = intValue;

intvalue는 정수 200이지만, doubleValue에 저장되면 200.0으로 저장된다.

 

char charValue = 'A';

int intValue = charValue;	//2바이트인 char는 유니코드로 변환되어서 int타입에 저장. 65가 저장

 

강제 타입 변환

강제 타입 변환은 큰 데이터 타입을 작은 데이터 타입으로 쪼개어서 저장하는 것을 의미한다.

 

" 작은 크기 타입  =  (작은 크기 타입)  큰  크기  타입 "

int intValue = 1030297770;

byte byteValue = (byte) intValue; //강제 타입 변환

intValue를 1byte씩 쪼개고 제일 끝 1byte만 byteValue에 저장한다.

 

이 경우 byteValue에는 00001010, 즉 십진수 10이 저장되며, 값 보존이 안되는 것을 확인할 수 있다.

 

만약 정수 10을 byte 타입으로 강제 변환 할 경우에는

int intValue=10;

byte byteValue= (byte) intValue;

10을 1byte씩 끊었을 때 끝 byte (00001010)을 제외한 나머지 3byte가 다 0으로 채워지기 때문에.

 

byteValue의 값이 10으로 유지된다.

 

long longValue = 300;

int intValue = (int) longValue;

이 경우도 long 타입의 8byte 중 끝의 4byte로 300을 충분히 표현할 수 있으므로

 

int타입으로 강제 변환하였을때 값이 유지된다.

 

double doubleValue = 3.14;

int intValue = (int) doubleValue; //소수점 이하 14는 지워지고 정수 부분인 3만 저장

실수 타입은 정수 타입으로 자동 변환되지 않기 때문에, 강제 타입 변환을 사용해야한다.

 

이때 소수점 이하 부분은 버려지고, 정수 부분만 저장된다.

 

 

**********

만약 사용자로부터 입력 받은 값을 변환하고자 한다면, 그 값의 손실이 발생해서는 안된다.

 

따라서 어떤 정수값과 실수값을 다른 타입으로 변환하고자 할 때는 변환될 타입의 최소값과 최대값을

 

벗어나는지를 확인해보아야한다.

 

타입 최대값 상수 최소값 상수
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

 

int i=50;
		
		if ((i<Byte.MAX_VALUE)||(i>Byte.MIN_VALUE)){  //i의 값이 byte 타입의 표현범위 안에 속하면
			byte b = (byte) i;
			System.out.print(b);	//강제 타입 변환
		}
		else {
			System.out.println("byte 타입으로 변환할 수 없습니다.");
		}

 

 

 

 

java는 피연산자가 정수일 경우 정수 연산으로 계산하고, 당연히 결과 값도 정수이다.

double f;

f = 1/5;

따라서 위 코드에서도 정수 연산을 하고 결과값으로 0.2가 아닌, 정수 0을 내놓는다.

 

우리가 흔히 알고 있는 값 0.2를 얻으려면 어떻게 해야할까?

 

바로 피연산자를 변환하는 것이다.

 

double f;

f = (double) i / 5;

 

이 경우 형변환 연산자가 우선순위가 높기 때문에 먼저 정수 1이 1.0으로 변환된다.

 

이때 피연산자가 1.0 과 5 이므로 정수 5도 마찬가지로 double로 자동 형변환이 되고, 1.0 / 5.0의 결과로 0.2가 나온다.

'Dev > Java' 카테고리의 다른 글

[Java] Switch 조건문  (0) 2022.06.27
[Java] if 조건문  (0) 2022.06.26
[Java] 상수 / 변수 타입 추론  (0) 2022.06.23
[Java] 정수형 / 실수형 / 논리형  (0) 2022.06.23
[Java] 자료형 / 변수 선언 / 문자형,문자열 자료형  (0) 2022.06.23