코딩 스쿨 Java

언어선택 : HTMLCSSJAVAJAVASCRIPTMYSQLSQL PHP

Java Type Casting

Java Type Casting: 자바에서의 형 변환

Type Casting은 자바에서 한 데이터 타입을 다른 데이터 타입으로 변환하는 과정을 말합니다. 자바에는 두 가지 유형의 형 변환이 있습니다: 자동 형 변환(Implicit Casting)과 명시적 형 변환(Explicit Casting)입니다.


1. 자동 형 변환 (Implicit Casting)

자동 형 변환은 작은 데이터 타입에서 큰 데이터 타입으로 변환할 때 자동으로 이루어집니다. 즉, 손실 없이 변환할 수 있을 때 컴파일러가 자동으로 처리합니다.

데이터 타입 크기 순서:

byteshortintlongfloatdouble

예시:

public class Main {
    public static void main(String[] args) {
        int myInt = 9;
        double myDouble = myInt;  // 자동 형 변환: int에서 double로

        System.out.println(myInt);    // 출력: 9
        System.out.println(myDouble); // 출력: 9.0
    }
}

설명:

정수형 int가 자동으로 부동 소수점형 double로 변환됩니다. 작은 타입인 int는 큰 타입인 double로 변환할 때 데이터 손실이 없으므로 자동으로 형 변환이 이루어집니다.


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

명시적 형 변환은 큰 데이터 타입에서 작은 데이터 타입으로 변환할 때 사용됩니다. 이 경우 데이터 손실이 발생할 수 있기 때문에 캐스팅을 명시적으로 수행해야 합니다.

예시:

public class Main {
    public static void main(String[] args) {
        double myDouble = 9.78;
        int myInt = (int) myDouble;  // 명시적 형 변환: double에서 int로

        System.out.println(myDouble); // 출력: 9.78
        System.out.println(myInt);    // 출력: 9
    }
}

설명:

doubleint로 변환하는 경우 소수점 이하가 잘려서 데이터 손실이 발생할 수 있습니다. 이를 방지하기 위해 명시적으로 (int)라고 캐스팅을 지정합니다.


3. 참조형 변환 (Reference Type Casting)

자바에서 객체 형 변환은 클래스 상속 구조에서 부모 클래스와 자식 클래스 간의 형 변환을 말합니다. 객체 형 변환도 **업캐스팅(Upcasting)**과 **다운캐스팅(Downcasting)**으로 나뉩니다.

업캐스팅 (Upcasting)

자식 클래스 타입의 객체를 부모 클래스 타입으로 변환하는 것은 자동으로 이루어집니다.

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

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

public class Main {
    public static void main(String[] args) {
        Animal myDog = new Dog();  // 업캐스팅: Dog 객체를 Animal 타입으로
        myDog.sound();  // 출력: Dog barks
    }
}

다운캐스팅 (Downcasting)

부모 클래스 타입의 객체를 자식 클래스 타입으로 변환하는 것은 명시적으로 해야 하며, 안전하지 않을 수 있습니다.

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

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

    public void bark() {
        System.out.println("Barking...");
    }
}

public class Main {
    public static void main(String[] args) {
        Animal myAnimal = new Dog();  // 업캐스팅
        Dog myDog = (Dog) myAnimal;   // 다운캐스팅
        myDog.bark();  // 출력: Barking...
    }
}

설명:

다운캐스팅은 캐스팅을 명시적으로 해야 하며, 타입이 맞지 않으면 **ClassCastException**이 발생할 수 있습니다.


4. 형 변환 예외 (ClassCastException)

잘못된 타입으로 객체를 캐스팅하면 **ClassCastException**이 발생합니다. 예를 들어, 상속 관계가 없는 클래스들 간의 다운캐스팅 시 발생할 수 있습니다.

class Animal {
}

class Dog extends Animal {
}

class Cat extends Animal {
}

public class Main {
    public static void main(String[] args) {
        Animal myAnimal = new Cat();
        Dog myDog = (Dog) myAnimal;  // 런타임 오류: ClassCastException
    }
}

설명:

Cat 객체는 Dog 객체로 변환할 수 없으므로 다운캐스팅이 불가능합니다. 이러한 경우 예외 처리instanceof 연산자를 사용하여 캐스팅이 가능한지 확인할 수 있습니다.


5. 형 변환 요약

  1. 자동 형 변환: 작은 데이터 타입에서 큰 데이터 타입으로 변환. 예: intdouble.
  2. 명시적 형 변환: 큰 데이터 타입에서 작은 데이터 타입으로 변환 시 (type)을 사용. 예: doubleint.
  3. 업캐스팅: 자식 클래스 객체를 부모 클래스 타입으로 변환. 자동으로 이루어짐.
  4. 다운캐스팅: 부모 클래스 객체를 자식 클래스 타입으로 변환. 명시적으로 해야 하며, 안전하지 않을 수 있음.
  5. 형 변환 예외: 잘못된 다운캐스팅을 시도하면 ClassCastException이 발생.

6. instanceof 연산자

다운캐스팅 전에 객체가 올바른 타입인지 확인하려면 instanceof 연산자를 사용합니다.

if (myAnimal instanceof Dog) {
    Dog myDog = (Dog) myAnimal;
    myDog.bark();
} else {
    System.out.println("Casting not allowed");
}

설명:

instanceof 연산자는 객체가 특정 클래스의 인스턴스인지 확인하는 데 사용됩니다. 다운캐스팅 전에 타입을 확인하여 예외를 방지할 수 있습니다.


요약

Java Type Casting은 데이터 타입을 변환하는 중요한 개념으로, 작은 타입에서 큰 타입으로의 자동 형 변환, 큰 타입에서 작은 타입으로의 명시적 형 변환, 그리고 참조형 타입 변환이 있습니다. 업캐스팅은 자동으로 이루어지지만 다운캐스팅은 명시적으로 수행해야 하며, 캐스팅 전 instanceof 연산자를 사용해 타입 검사를 하면 안전하게 다운캐스팅을 수행할 수 있습니다.


copyright ⓒ 스타트코딩 all rights reserved.
이메일 : startcodingim@gamil.com