업 캐스팅 및 다운 캐스팅은 Java의 중요한 부분으로, 간단한 구문을 사용하여 복잡한 프로그램을 작성할 수 있으며 다형성 또는 다른 객체 그룹화와 같은 큰 이점을 제공합니다. Java는 서브 클래스 유형의 오브젝트가 모든 수퍼 클래스 유형의 오브젝트로 처리되도록합니다. 이를 업 캐스팅이라고합니다. 업 캐스팅은 자동으로 수행되지만 다운 캐스팅은 프로그래머가 수동으로 수행해야하며 그 이유를 설명하기 위해 최선을 다할 것입니다.
업 캐스팅 및 다운 캐스팅은 프리미티브를 서로 캐스팅하는 것과 같지 않으며 프로그래머가 객체 캐스팅을 배우기 시작할 때 많은 혼란을 초래하는 것이라고 생각합니다.
다형성 : 자바의 모든 메소드는 기본적으로 가상입니다. 즉, 메소드가 final 또는 static으로 선언되지 않은 경우 상속에 사용될 때 모든 메소드를 대체 할 수 있습니다 .
아래 예제 getType();
는 object (Dog, Pet, Police Dog) 유형에 따라 어떻게 작동 하는지 볼 수 있습니다 .
세 마리의 개가 있다고 가정
개-슈퍼 클래스입니다.
애완견-애완견은 개를 연장합니다.
경찰견-경찰견은 애완견을 연장합니다.
public class Dog{
public String getType () {
System.out.println("NormalDog");
return "NormalDog";
}
}
/**
* Pet Dog has an extra method dogName()
*/
public class PetDog extends Dog{
public String getType () {
System.out.println("PetDog");
return "PetDog";
}
public String dogName () {
System.out.println("I don't have Name !!");
return "NO Name";
}
}
/**
* Police Dog has an extra method secretId()
*/
public class PoliceDog extends PetDog{
public String secretId() {
System.out.println("ID");
return "ID";
}
public String getType () {
System.out.println("I am a Police Dog");
return "Police Dog";
}
}
다형성 : 자바의 모든 메소드는 기본적으로 가상입니다. 즉, 메서드가 final 또는 static으로 선언되지 않은 경우 상속에 사용될 때 모든 메서드를 재정의 할 수 있습니다. (설명은 가상 테이블 개념에 속함)
가상 테이블 / 디스패치 테이블 : 객체의 디스패치 테이블에는 객체의 동적으로 바인딩 된 메서드의 주소가 포함됩니다. 메소드 호출은 오브젝트의 디스패치 테이블에서 메소드 주소를 페치하여 수행됩니다. 디스패치 테이블은 동일한 클래스에 속하는 모든 객체에 대해 동일하므로 일반적으로 객체간에 공유됩니다.
public static void main (String[] args) {
/**
* Creating the different objects with super class Reference
*/
Dog obj1 = new Dog();
` /**
* Object of Pet Dog is created with Dog Reference since
* Upcasting is done automatically for us we don't have to worry about it
*
*/
Dog obj2 = new PetDog();
` /**
* Object of Police Dog is created with Dog Reference since
* Upcasting is done automatically for us we don't have to worry
* about it here even though we are extending PoliceDog with PetDog
* since PetDog is extending Dog Java automatically upcast for us
*/
Dog obj3 = new PoliceDog();
}
obj1.getType();
인쇄물 Normal Dog
obj2.getType();
인쇄물 Pet Dog
obj3.getType();
인쇄물 Police Dog
다운 캐스팅은 프로그래머가 수동으로 수행해야합니다.
당신이 호출 할 때 secretID();
의 방법 obj3
되는 PoliceDog object
하지만를 기준으로 Dog
하는을하기 때문에이 오류가 발생합니다 계층 구조의 슈퍼 클래스 obj3
에 대한 액세스 권한이없는 secretId()
방법. 해당 메소드를 호출하려면 해당 obj3을 수동으로 다운 캐스트해야합니다. PoliceDog
( (PoliceDog)obj3).secretID();
인쇄 ID
인보 할 수있는 유사한 방법 dogName();
으로 방법을 PetDog
클래스는 다운 캐스트 필요 obj2
로 PetDog
obj2보다가 참조되기 때문에 Dog
과에 액세스 할 수없는 dogName();
방법을
( (PetDog)obj2).dogName();
왜 그렇게해서 업 캐스팅이 자동이지만 다운 캐스팅이 수동이어야합니까? 글쎄, 업 캐스팅은 결코 실패 할 수 없다. 당신이 다른 개 그룹이 자신의 유형에에 그들 모두를 다운 캐스트 싶은 경우, 다음 기회는 이러한 개 중 일부는 실제로 다른 유형의 수 있습니다 즉 것을, 거기 PetDog
, PoliceDog
및 프로세스가 던져 실패 ClassCastException
.
객체를 수퍼 클래스 유형으로 참조한 경우 객체를 수동으로 다운 캐스트 해야하는 이유 입니다.
참고 : 여기에서 참조한다는 것은 다운 캐스트 할 때 객체의 메모리 주소를 변경하지 않고 여전히이 경우 특정 유형으로 그룹화하는 것과 동일하게 유지함을 의미합니다 Dog
Dog
는입니다Animal
. 오버로드 된 특정 방법을 사용하지 않는 한 대부분의 시간 업 캐스팅은 불필요합니다. 와callme
에 모두 존재합니다 . 에서만 존재 는 캐스팅하는 하는 것이 작업 할 수 있습니다.Animal
Dog
callme2
Dog
a
Dog