본문 바로가기

언어/Java

[ 자바 / Java ] 변수 타입 간의 형변환 하기

반응형

자바에서는 데이터 타입 간에 값을 변환하는 것을 "형변환"이라고 합니다. 형변환에는 두 가지 유형이 있습니다: 묵시적 형변환명시적 형변환입니다. 자바에서 변수 또는 리터럴의 타입을 변경하는 방법과 주의해야 할 점을 설명하겠습니다.

1. 묵시적 형변환 (Implicit Casting 또는 Widening)

묵시적 형변환은 자바가 자동으로 수행하는 변환으로, 크기가 작은 타입에서 큰 타입으로 변환할 때 발생합니다. 예를 들어, int 타입을 long 타입으로 변환하는 경우, 자바는 이를 자동으로 처리합니다.

예시:

int myInt = 100;
long myLong = myInt; // int -> long 묵시적 형변환
double myDouble = myLong; // long -> double 묵시적 형변환

System.out.println("myInt: " + myInt); // 100
System.out.println("myLong: " + myLong); // 100
System.out.println("myDouble: " + myDouble); // 100.0

위의 예시에서 int 타입의 myIntlong 타입의 myLong으로 자동 변환되고, myLong은 다시 double 타입의 myDouble로 자동 변환됩니다.

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

명시적 형변환은 개발자가 명시적으로 수행하는 변환으로, 크기가 큰 타입에서 작은 타입으로 변환할 때 필요합니다. 이 과정에서는 데이터 손실이 발생할 수 있으므로, 명시적 형변환을 수행해야 합니다.

예시:

double myDouble = 9.78;
int myInt = (int) myDouble; // double -> int 명시적 형변환

System.out.println("myDouble: " + myDouble); // 9.78
System.out.println("myInt: " + myInt); // 9 (소수점 이하가 잘림)

위의 예시에서 double 타입의 myDoubleint 타입의 myInt로 변환할 때 명시적으로 (int)를 사용했습니다. 이 과정에서 소수점 이하의 값이 손실됩니다.

3. 형변환 규칙과 주의사항

  • 정수와 실수 간의 변환:
    • 정수를 실수로 변환하는 것은 묵시적 형변환이 가능하지만, 실수를 정수로 변환할 때는 명시적 형변환이 필요합니다.
    • 실수를 정수로 변환할 때 소수점 이하의 값은 잘리므로 데이터 손실이 발생할 수 있습니다.
  • 크기가 다른 정수 간의 변환:
    • 크기가 작은 정수 타입에서 큰 정수 타입으로의 변환은 묵시적 형변환이 가능합니다 (예: byte에서 int로).
    • 크기가 큰 정수 타입에서 작은 정수 타입으로의 변환은 명시적 형변환이 필요하며, 이 경우 데이터 손실이 발생할 수 있습니다.
  • 문자와 정수 간의 변환:
    • char 타입은 int 타입으로 묵시적 형변환이 가능합니다. 이는 char가 유니코드 값을 갖기 때문입니다.
    • intchar로 변환할 때는 명시적 형변환이 필요하며, 이 경우 int 값이 유니코드 값으로 해석됩니다.

예시:

char myChar = 'A';
int myInt = myChar; // char -> int 묵시적 형변환
char newChar = (char) myInt; // int -> char 명시적 형변환

System.out.println("myChar: " + myChar); // 'A'
System.out.println("myInt: " + myInt); // 65 (유니코드 값)
System.out.println("newChar: " + newChar); // 'A'

4. 참조 타입 간의 형변환

참조 타입 간의 형변환은 객체 지향 프로그래밍에서 중요한 역할을 합니다. 이는 주로 상속 관계에서 사용되며, 다음 두 가지로 나뉩니다:

  • 업캐스팅 (Upcasting):
    • 자식 클래스의 객체를 부모 클래스의 참조 타입으로 변환하는 것을 말합니다.
    • 업캐스팅은 묵시적 형변환으로, 명시적 형변환 없이도 가능합니다.
  • 다운캐스팅 (Downcasting):
    • 부모 클래스의 참조 타입을 자식 클래스의 참조 타입으로 변환하는 것을 말합니다.
    • 다운캐스팅은 명시적 형변환이 필요하며, 런타임에 ClassCastException이 발생할 수 있습니다.

예시:

class Animal {
    public void makeSound() {
        System.out.println("Animal sound");
    }
}

class Dog extends Animal {
    public void makeSound() {
        System.out.println("Bark");
    }

    public void wagTail() {
        System.out.println("Wagging tail");
    }
}

public class Main {
    public static void main(String[] args) {
        Animal myAnimal = new Dog(); // 업캐스팅 (묵시적 형변환)
        myAnimal.makeSound(); // "Bark" (오버라이드된 메서드 호출)

        Dog myDog = (Dog) myAnimal; // 다운캐스팅 (명시적 형변환)
        myDog.wagTail(); // "Wagging tail"
    }
}

위 예시에서 Animal 클래스는 부모 클래스이고, Dog 클래스는 이를 상속받는 자식 클래스입니다. Dog 객체를 Animal 타입으로 업캐스팅할 때는 명시적 형변환이 필요 없지만, 이를 다시 Dog 타입으로 다운캐스팅할 때는 명시적 형변환이 필요합니다.

5. 오토박싱 (Autoboxing)과 언박싱 (Unboxing)

자바는 기본 데이터 타입과 해당하는 래퍼 클래스 간의 자동 변환을 지원합니다. 이를 오토박싱과 언박싱이라고 합니다.

  • 오토박싱 (Autoboxing):
    • 기본 데이터 타입이 자동으로 래퍼 클래스 객체로 변환되는 것.
    • 예: int -> Integer
      int num = 10;
      Integer wrappedNum = num; // 오토박싱
  • 언박싱 (Unboxing):
    • 래퍼 클래스 객체가 자동으로 기본 데이터 타입으로 변환되는 것.
    • 예: Integer -> int
      Integer wrappedNum = new Integer(10);
      int num = wrappedNum; // 언박싱

이와 같은 형변환을 이해하고 적절히 사용하는 것은 자바 프로그래밍의 중요한 부분입니다. 형변환을 통해 다양한 데이터 타입을 유연하게 다루고, 코드의 안정성과 성능을 유지할 수 있습니다.

반응형