Back-end/Java
형 변환
J-Jay
2023. 2. 18. 17:53
728x90
정수는 실수에 포함 된다
실수 | ||||
유리수 | 무리수 | |||
정수 | 정수가 아닌 유리수 | |||
양의 정수 | 0 | 음의 정수 |
double형에 정수 저장
public class DoubleToInt {
public static void main(String[] args){
double d1 = 50;
double d2 = 5000L;
}
}
- dobule형 실수 Type에 정수 값은 대입이 가능하다
Int형에 실수 저장
public class IntToDouble {
public static void main(String[] args){
int a = 50.0; //java: incompatible types: possible lossy conversion from double to int
int b = 100.5f; //java: incompatible types: possible lossy conversion from double to int
}
}
- Int형 정수 Type에 실수 값을 대응하면 오류가 발생한다
>실수는 정수를 포함하지만, 정수는 실수를 포함할 수 없기 때문에 컴파일 오류 발생
형 변환(Int정수 Type에 실수 값을 저장)
- 실수 값을 정수타입의 변수에 저장하려면 정수타입으로 형 변환 해야한다
- 변환하고자 하는 값 앞에 (int)를 추가한다
- 100.5f 라는 실수를 정수로 저장시 소수점 이하부분은 잘려서 저장한다
- 이를 명시적 타입변환(강제 타입 변환 explict conversion)이라 한다
public class IntToDouble {
public static void main(String[] args){
int a = (int) 50.0; //50
int b = (int) 100.5f; //100
}
}
크기가 큰 Type은 크기가 작은 Type을 저장할 수 있다
- long 타입의 변수는 int, short byte 값을 저장할 수 있다
- int 타입 변수는 short, byte 값을 저장할 수 있다
- short 타입 변수는 byte 값을 저장할 수 있다
public class IntToDouble {
public static void main(String[] args){
byte b = 5;
short s = b;
int i = s;
long l = i;
}
}
그럼 float(4byte) 타입은 long(8byte)를 담을 수 없을까?
public class Test {
public static void main(String[] args){
long l = 10L;
float f = l;
System.out.println(l); //10
System.out.println(f); //10.0
}
}
위와같이 정상적으로 잘 출력이 된다
작은숫자라서 그런가 싶어 MAX_VALUE로 다시 한번 해보자
public class Test {
public static void main(String[] args){
long l = Long.MAX_VALUE;
float f = l;
System.out.println(l); //9223372036854775807
System.out.println(f); //9.223372E18
}
}
정상적으로 잘 표현해준다
근데 왜?(크기가 큰 타입의 값을 작은 타입에 옮길수 없는데...)
이유는 일반적으로 메모리 설계상 정수타입보다 실수 타입이 더 크게 설정 되어 있기 때문이다
long 범위 : -9,223,372,036,854,775,808 ~ 9.223.372.036.854.755.807
float 범위 : 3.4 x 10^-38 ~ 3.4 x 10^38
[참고]
4바이트 float이 더 큰 수를 표현할수 있는 이유는 부동소수점 방식의 표현 때문이다.
부동 소수점 방식에서는 지수부와 가수부를 나누고, 가수부에는 실제 값을 지수부에는 2제곱을 얼마나 곱할지 표현하기 때문에 수의 표현 범위는 long 타입보다 더 커지게 된다
실제로 큰지 확인
public class Test {
public static void main(String[] args){
long l = Long.MAX_VALUE;
float f = Float.MAX_VALUE;
System.out.println(l >f ); //false
System.out.println(l <f ); //true
}
}
Java에서 강제 형 변환시 주의할 점!
public class Test {
public static void main(String[] args){
int i = Integer.MAX_VALUE;
short s = (short) i;
System.out.println(i); //2147483647
System.out.println(s); //-1
}
}
- int의 MAX_VALUE를 short로 강제 형변환을 할 경우 -1의 값이 나오게 된다
>이유는 2의 보수를 생각하면 알 수 있다