처음부터 차근차근

[Java] 형변환 본문

Language/Java

[Java] 형변환

HangJu_95 2023. 12. 15. 15:04
728x90

자동 형변환

작은 범위 숫자 타입에서 큰 범위 숫자 타입으로의 대입은 개발자가 직접 형 변환을 하지 않아도 되며, 자동으로 발생합니다.

public static void main(String[] args) {
    int intValue = 10;
    long longValue;
    double doubleValue;

    longValue = intValue; // int -> long
    System.out.println("longValue = " + longValue); //longValue = 10

    doubleValue = intValue; // int -> double
    System.out.println("doubleValue1 = " + doubleValue); //doubleValue1 = 10.0

    doubleValue = 20L; // long -> double
    System.out.println("doubleValue2 = " + doubleValue); //doubleValue2 = 20.0
}

명시적 형변환

큰 범위에서 작은 범위 대입은 명시적으로 형 변환이 필요합니다.

이때 명시적으로 형 변환을 하기 위해 소괄호 안에 타입을 적어서 명시적으로 형 변환을 합니다.

public static void main(String[] args) {
    double doubleValue = 1.5;
    int intValue = 0;

    //intValue = doubleValue; // 컴파일 오류 발생
    intValue = (int) doubleValue; // 명시적 형변환
    System.out.println(intValue); // 출력:1
}
intValue = (int) doubleValue; //형변환

이렇게 작성하는 것을 명시적 형변환이라고 합니다.

형 변환과 오버플로우

형변환을 할 때 작은 숫자가 표현할 수 있는 범위를 넘어선다면 이것을 오버플로우라고 합니다.

보통 오버플로우가 발생한다면 마치 시계가 한바퀴 돈 것 처럼 다시 처음부터 시작합니다.

public static void main(String[] args) {
    long maxIntValue = 2147483647; //int 최고값
    long maxIntOver = 2147483648L; //int 최고값 + 1(초과)
    long maxIntOver2 = 3147483648L; // int 최고값을 한참 넘었다.
    int intValue = 0;

    intValue = (int) maxIntValue; //형변환
    System.out.println("maxIntValue casting=" + intValue); //출력:2147483647
    intValue = (int) maxIntOver; //형변환
    System.out.println("maxIntOver casting=" + intValue); //출력:-2147483648
    intValue = (int) maxIntOver2; // 형변환
    // -10억이 추가되었다.
    // 시계가 한바퀴 돌고 나서 다시 시작하는 순으로 발생
    // overflow 발생
    System.out.println("maxIntOver2 casting=" + intValue); //출력:-1147483648
}

오버플로우가 발생하지 않도록 큰 사이즈의 타입으로 변경하는 것이 좋습니다.

형변환과 계산

자바에서 형변환 계산은 다음 두가지를 기억하면 됩니다.

  • 같은 타입끼리의 계산은 같은 타입의 결과를 낸다.
  • 서로 다른 타입의 계산은 큰 범위로 자동 형변환이 일어난다.
public static void main(String[] args) {

        int div1 = 3 / 2;
        // int와 int로 계산했기 때문에 int가 나온다
        System.out.println("div1 = " + div1); //1

        // int와 int로 계산했기 때문에 int가 나온다
        double div2 = 3 / 2;
        System.out.println("div2 = " + div2); //1.0

        // double와 int로 계산했기 때문에 double가 나온다
        double div3 = 3.0 / 2;
        System.out.println("div3 = " + div3); //1.5

        // double과 int로 계산했기 때문에 double이 나온다.
        // 명시적 형변환 사용
        double div4 = (double) 3 / 2;
        System.out.println("div4 = " + div4); //1.5

        int a = 3;
        int b = 2;
        // 이때 a앞에 double을 붙여줬기 때문에 double이 나온다.
        // 명시적 형변환 사용
        double result = (double) a / b;

        System.out.println("result = " + result); //1.5
    }

 

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

[Java] Array  (1) 2023.12.15
[Java] Scanner  (0) 2023.12.15
[Java] 조건문, 반복문  (0) 2023.12.15
[Java] 연산자  (0) 2023.12.14
[Java] Java 변수 선언, 데이터 타입  (0) 2023.12.14