
고양이,강아지에서 생명체로 올라갈수록 추상적
업캐스팅
public class Main {
public static void main(String[] args) {
Animal animal = new Cat(); // 자동 형변환
animal.exist();
animal.makeSound();
}
}
주의사항
업캐스팅은 부모의 타입으로 데이터를 다룰 수 있지만 자식 클래스의 고유기능을 활용할 수 없음
다운캐스팅
public class Main {
public static void main(String[] args) {
// 다형성 활용
Animal animal = new Cat();
animal.exist();
animal.makeSound();
Cat cat = (Cat) animal; // 다운캐스팅(부모Animal -> 자식Cat)
cat.scratch(); // 자식 클래스의 기능 활용 가능
}
}
주의사항
잘못된 다운캐스팅은 컴파일단계에서 감지할 수 없음
-> instanceof를 사용해 객체가 특정 클래스나 인터페이스의 인스턴스인지 확인해야함
원칙적으로 자식 클래스는 부모 클래스가 누구인지 알지만
부모 클래스는 자식이 누구인지 알 길이 없음
근데 이처럼 형변환을 통해
Animal animal = new Cat();
Cat cat = (Cat) animal;
이런식으로 다운캐스팅을 했다고 가정해보자
그렇다면 원래 부모 클래스의 객체였던 animal은
이제 자식클래스가 누구인지 알 수 있는것 아닌가 ???
궁금해서 바로 지피티에게 물어보았다

결론부터 말하자면 아니다 !
왜냐하면 animal 객체가 본질적으로 변하는게 아닌 참조할 수 있게 되었기 때문이라는데
여기서 또 궁금증
메서드는 클래스영역 메모리에 저장이 된다
이런식으로 다운캐스팅을 하게돼서 자식의 메서드를 참조할 수 있게 되었다면
클래스영역 메모리에 접근을 한 것이므로 자식의 클래스영역에 적힌 것들을 알 수 있는것 아닌가 ?

결론은 또 아니다 ㅋㅋㅋㅋㅋㅋ
왜 안되는지는 이 답변 때문에 알았는데
다운캐스팅을 했을때 animal을 cat이라고 간주할 수 있음을 아는건
컴파일러이기 때문 ,,
animal 클래스 자체는 cat 클래스에 대한 정보를 아무것도 모르지만
컴파일러는 다운캐스팅이 된걸 알고있으므로 컴파일러가 cat의 정보를 읽어오는것
궁금증 해결