생각정리/Java
[JAVA] 업캐스팅, 다운캐스팅
생각중임
2023. 8. 17. 14:51
캐스팅(Casting)
타입을 변환하는 것을 말하면 형변환이라고도 한다.
기본형 타입을 서로 형변환 하는 것과 기본형과 래퍼클래스 간의 형변환을 말할 수 있다.
업캐스팅(Upcasting)
자식 클래스의 객체가 부모 클래스 타입으로 형변환 하는 것
부모 클래스로 형변환이 되어 자식 클래스에만 있는 멤버는 사용할 수 없다.
업캐스팅을 하여도 오버라이딩 된 메서드는 자식 클래스의 메서드로 실행된다.
서로 다른 자식 클래스들을 하나의 부모 클래스로 묶어 사용하기에 용이하다.
다운캐스팅(Downcasting)
업캐스팅된 클래스를 다시 원래의 타입으로 형변환 하는 것
형 변환할 때 자식클래스의 캐스팅 연산자는 생략이 불가능하다. (괄호로 표시하는 것)
형제 클래스(같은 클래스를 상속받는 클래스) 끼리 서로 캐스팅이 불가능하다.
instanceof 연산자
어느 객체 변수가 어느 클래스 타입인지 판별해 주는 연산자
class Animal {
String name;
Animal (String name) {
this.name = name;
}
}
class Dog extends Animal {
String breeds;
Dog (String name) {
super(name);
}
}
public class Main {
public static main(String[] args) {
Animal a = new Animal("나는동물");
Dog d = new Dog("흰둥이");
Animal a2 = (Animal)d; // 업캐스팅 - 자식에서 부모로
//Animal a2 = d; // 업캐스팅은 괄호 생략 가능
a2.name = "이름";
//a2.breeds = "종"; // Animal에는 breeds가 없어 컴파일 오류가 난다.
//Dog d2 = (Dog)a; // a는 업캐스팅이 된 객체가 아니므로 컴파일 오류가 난다.
Dog d2 = (Dog)a2; // 다운캐스팅 - 부모로 변한 자식을 다시 자식으로
d2.name = "스누피"; // d, a2, d2 모두 연결되어 name이 스누피가 된다.
d2.breeds = "비글"; // d는 breeds를 입력한적 없지만 d2로 인한 "비글"이 된다.
Animal a3 = new Dog("스파이크"); // 업캐스팅
Dog d3 = (Dog)a3; // 다운캐스팅
// (객체 instanceof 클래스)
System.out.println(a instanceof Animal); // true
System.out.println(a instanceof Dog); // false 업캐스팅 된 자식 클래스가 아니라 Dog로 다운캐스팅 불가
System.out.println(a2 instanceof Animal); // true
System.out.println(a2 instanceof Dog); // true
System.out.println(d instanceof Animal); // true
System.out.println(d instanceof Dog); // true
System.out.println(d2 instanceof Animal); // true
System.out.println(d2 instanceof Dog); // true