[DEV] J-Jay

형 변환 본문

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의 보수를 생각하면 알 수 있다

'Back-end > Java' 카테고리의 다른 글

비트연산자  (0) 2023.02.19
CHAR 문자 타입  (0) 2023.02.19
정수/실수/산술연산자  (0) 2023.02.16
논리형 TYPE/연산자  (0) 2023.02.15
변수/리터럴(literal)  (0) 2023.02.14