타입변환에는 두가지 종류가 있다.
묵시적(자동) 타입변환, 그리고 명시적(강제) 타입 변환이다.
자동 타입 변환
자동 타입 변환은 메모리의 크기가 작은 타입이 큰 크기의 타입에 저장될 때 발생한다.
먼저 크기별로 정수 및 실수 타입을 정리하자면 다음과 같다.
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 |
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!