형 변환

황상익·2024년 3월 19일

Inflearn JAVA

목록 보기
8/61

형 변환1

작은 범위에서 큰 범위로는 당연히 값을 넣을 수 있다.
int -> long -> double

큰 범위에서 작은 범위는 문제가 발생할 수 있다
1. 소수점 버람
2. 오버플로우

public class Casting1 {
    public static void main(String[] args) {
        int intVal = 10;
        long longVal;
        double doubleVal;

        longVal = intVal;
        System.out.println("longVal = " + longVal);

        doubleVal = longVal;
        System.out.println("doubleVal = " + doubleVal);

        doubleVal = intVal;
        System.out.println("doubleVal1 = " + doubleVal);

        doubleVal = 20L;
        System.out.println("doubleVal2 = " + doubleVal);
    }
}

형이 변경 되는 것을 형 변환이라고 하는데, 작은 범위 숫자 타입에서 큰 범위 숫자 타입으로 대입은 개발자가 이렇게 직접 형 변환을 하지 않아도 된다.
이런 과정이 자동으로 일어나기 때문에 자동 형변환, 또는 묵시적 형 변환 이라고 한다.

형 변환 2
큰 범위에서 작은범위 대입은 명시적 형변환이 필요하다.

public class Casting2 {
    public static void main(String[] args) {
        double doubleVal = 1.5;
        int intVal = 0;

        intVal = (int) doubleVal; //명시작 casting 해줘야 함
        System.out.println(intVal);
        System.out.println("doubleVal = " + doubleVal); // 값 변경 되지는 않는다
    }
}

int형은 double 형보다 숫자의 표현 범위가 작다. 이 경우 숫자가 손실되는 문제 발생 가능성. -> CompileError

이런 위험을 개발자가 감수하고 값을 대입하고 싶다면 데이터 타입을 강제로 변경 가능

intVal = (int) doubleVal; -> 명시적 형변환

캐스팅 용어
형 변환 후 출력해보면 1이 출력되는 결과를 볼 수 있다.
참고로 형 변환을 한다 해서 doubleVal에 있는 값이 정수형으로 변환 되는 것은 아니다. 그대로 유지

형변환 오버플로우

public class Casting3 {
    public static void main(String[] args) {
        long maxIntVal = 2147483647;
        long maxIntOver = 2147483648L;
        int intVal = 0;

        intVal = (int) maxIntVal;
        System.out.println("intVal = " + intVal);

        intVal = (int) maxIntOver;
        System.out.println("intVal = " + intVal);
    }
}

int로 표현 할 수 있는 가장 큰 수인 2147483647보다 숫자 1큰 수를 입력하면, 리터럴은 int 범위를 넘어가기 때문에 마지막에 L을 붙여서 long형을 사용
이렇게 기존 범위를 초과해서 표현하게 되면 전혀 다른 숫자 표현, -> 오버플로우

  • 오버플로우가 발생하면, 시계가 한바퀴 돈 것 처럼 다시 처음부터 시작.

계산과 형 변환

public class Casting4 {
    public static void main(String[] args) {
        int div1 = 3 / 2;
        System.out.println("div1 = " + div1);

        double div2 = 3 / 2;
        System.out.println("div2 = " + div2);

        double div3 = 3.0 / 2;
        System.out.println("div3 = " + div3);

        double div4 = (double) 3 / 2;
        System.out.println("div4 = " + div4);

        int a = 3;
        int b= 2;
        double rst = (double) a/ b;
        System.out.println("rst = " + rst);
    }
}

같은 타입끼리의 계산은 같은 타입의 결과
서로 다른 타입의 계산은 큰 범위로 자동 형 변환

profile
개발자를 향해 가는 중입니다~! 항상 겸손

0개의 댓글