본문 바로가기
Back-End/Java

자바의 형변환(Casting) 이해하기

by 두두리안 2024. 10. 22.
728x90

자바에서는 서로 다른 타입의 데이터를 변환하여 사용할 수 있습니다. 이를 형변환이라 부르며, 작은 데이터 타입에서 큰 데이터 타입으로 변환할 때는 자동으로 이루어집니다. 하지만 큰 데이터 타입에서 작은 데이터 타입으로 변환할 때는 명시적 형변환을 통해 직접적으로 변환을 지시해야 합니다. 이 글에서는 자바에서 자동 형변환과 명시적 형변환에 대해 살펴보겠습니다.

1. 자동 형변환 (Implicit Casting)

자바에서는 작은 범위의 타입에서 큰 범위의 타입으로 데이터를 변환하는 경우, 별다른 지시 없이도 자동으로 형변환이 이루어집니다. 예를 들어, int에서 long, 또는 long에서 double로 변환할 때 문제가 발생하지 않습니다. 다음 예제를 보겠습니다.

package casting;
public class Casting1 {
    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
    }
}

실행 결과:

longValue = 10
doubleValue1 = 10.0
doubleValue2 = 20.0

작은 데이터 타입에서 큰 데이터 타입으로의 형변환은 자바에서 자연스럽게 이루어집니다. 이것을 자동 형변환 혹은 묵시적 형변환이라고 합니다. 형을 맞춰주는 작업이 자동으로 이루어지기 때문에 개발자는 따로 신경 쓸 필요가 없습니다.

형변환 과정:

intValue = 10;
doubleValue = (double) intValue; // 형 맞추기
doubleValue = 10.0; // 형변환 후 최종 값

2. 명시적 형변환 (Explicit Casting)

이번에는 큰 범위의 데이터 타입에서 작은 범위의 데이터 타입으로 변환해보겠습니다. 이때는 명시적 형변환이 필요합니다. 예를 들어, double에서 int로 변환할 때, 자동으로 변환할 수 없기 때문에 직접 형변환을 지시해야 합니다.

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

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

double 타입의 실수 값을 int로 변환하려면 소수점이 손실됩니다. 이 과정에서 값을 명시적으로 변환하는 코드를 작성해야 하며, 이를 명시적 형변환이라고 부릅니다.

명시적 형변환 과정:

doubleValue = 1.5;
intValue = (int) doubleValue; // 형변환
intValue = 1; // 소수점이 제거됨

3. 형변환과 오버플로우 (Overflow)

만약 형변환 과정에서 작은 데이터 타입이 표현할 수 있는 범위를 넘어서면 오버플로우가 발생할 수 있습니다. 예를 들어, long 타입의 값이 int 타입의 최대값을 초과할 경우, 전혀 다른 값으로 변환됩니다.

package casting;
public class Casting3 {
    public static void main(String[] args) {
        long maxIntValue = 2147483647; // int의 최대값
        long maxIntOver = 2147483648L; // int의 최대값을 초과
        int intValue;

        intValue = (int) maxIntValue; // 정상 변환
        System.out.println("maxIntValue casting = " + intValue); 
        // 출력: 2147483647

        intValue = (int) maxIntOver; // 오버플로우 발생
        System.out.println("maxIntOver casting = " + intValue); 
        // 출력: -2147483648
    }
}

오버플로우가 발생하면 예측할 수 없는 값이 나타나므로 주의해야 합니다.

4. 계산 중 형변환

계산을 할 때도 형변환이 발생할 수 있습니다. 서로 다른 데이터 타입끼리 연산을 할 경우, 더 큰 범위의 타입으로 자동 형변환이 이루어집니다.

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

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

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

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

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

중요한 규칙:

  1. 같은 타입끼리의 계산은 같은 타입의 결과를 낸다.
  • int + int는 int 타입의 결과가 나오고, double + double은 double 타입의 결과가 나옵니다.
  1. 서로 다른 타입의 계산은 더 큰 타입으로 자동 형변환된다.
  • int + long은 long으로, int + double은 double로 형변환됩니다.

마무리

형변환은 자바에서 매우 중요한 개념이며, 자동 형변환과 명시적 형변환의 차이를 잘 이해하는 것이 중요합니다. 자동 형변환은 개발자의 부담을 덜어주지만, 명시적 형변환은 신중하게 사용해야 하며, 오버플로우와 같은 문제를 유발할 수 있기 때문에 주의해야 합니다. 데이터 타입을 올바르게 다루는 것이 안정적인 코드를 작성하는 첫걸음입니다.

728x90