작성
·
118
·
수정됨
0
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.
=========================================
[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예/아니오)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)
[질문 내용]
클래스와 인터페이스 활용 강의를 듣고 문득 하위클래스는 상위의 AbstractAnimal과 Fly인터페이스와 관련이 있다는 느낌을 받아서 다음과 같이 코드를 작성했습니다.
public static void main(String[] args) {
Dog dog = new Dog();
Chicken chicken = new Chicken();
Bird bird = new Bird();
AbstractAnimal bird2 = new Bird();
soundTest(dog);
soundTest(chicken);
soundTest(bird);
flyAnimalTest(chicken);
flyAnimalTest(bird);
soundTest(bird2);
flyAnimalTest((Fly)bird2);
}
private static void flyAnimalTest(Fly fly) {
System.out.println("날기테스트시작");
fly.fly();
System.out.println("날기테스트종료");
}
그런데 마지막 줄 flyAnimalTest에서 bird2는 인스턴스는 Bird2지만 호출타입은 AbstractAnimal이라서 AbstractAnimal을 Fly타입에 대입할 수 있나라는 의문도 들었고 무엇보다 AbstractAnimal에는 fly()라는 메서드가 없어서 이걸 AbstractAnimal에서 찾으면 당연히 없고 상위 클래스에서 fly를 찾으려고 해도 AbstractAnimal이 최상위니까 실행이 안되겠지? 라는 생각이 들었는데 이게 맞을까요?
그리고 한가지 더 궁금한게 있습니다. (Fly) bird2를 flyAnimalTest에 넣었는데 실행이 잘 됐습니다. bird2의 호출 타입은 Abstract이고 인스턴스는 Bird인데 (Fly)를 해주면 캐스팅 되는 과정이나 메모리상에서 fly함수를 어떻게 찾아가는지 과정을 알고싶습니다. bird2를 (Bird)로 다운캐스팅한 다음 flyAnimalTest메서드의 매개변수 Fly fly에 대입된 후에 작동하는 것은 이해가 가는데 (Fly)로 캐스팅했을 때 되는 이유는 무엇인가요?
답변 1
0
안녕하세요, 인프런 AI 인턴입니다.
박준형님의 질문에 답변드리겠습니다.
클래스와 인터페이스의 상속 및 구현에 관한 귀하의 질문은 자바의 다형성과 타입 캐스팅에 대한 이해가 필요합니다.
AbstractAnimal
은 Bird
의 최상위 클래스이고, Bird
는 Fly
인터페이스를 구현할 수 있습니다. 따라서 AbstractAnimal
타입의 변수를 Fly
타입으로 캐스팅하는 것이 가능한 경우는 그 변수가 실제로 Fly
인터페이스를 구현하는 클래스의 인스턴스일 때입니다. 즉, bird2
가 AbstractAnimal
타입이지만 실제로는 Fly
인터페이스를 구현하는 Bird
클래스의 인스턴스이기 때문에 Fly
로의 캐스팅이 가능합니다.
자바에서는 객체의 실제 타입이 캐스팅하려는 인터페이스를 구현하고 있으면, 그 타입을 해당 인터페이스 타입으로 캐스팅할 수 있습니다. 이 과정에서 JVM(자바 가상 머신)은 실행 시간에 객체의 실제 타입을 확인하고, 해당 타입이 명시된 인터페이스를 구현했는지 검사합니다. 이 검사를 통과하면, 객체는 안전하게 캐스팅되어 인터페이스에 정의된 메서드를 호출할 수 있습니다.
flyAnimalTest((Fly)bird2);
에서 bird2
를 (Fly)
로 캐스팅한 경우, bird2
의 실제 인스턴스 타입이 Fly
인터페이스를 구현하는 Bird
임을 JVM이 확인합니다. 그래서 이 캐스팅이 성공하고, fly
메서드를 찾아 호출할 수 있게 됩니다. 이는 다형성과 인터페이스에 대한 자바의 핵심 개념 중 하나입니다.
이러한 메커니즘은 객체지향 프로그래밍의 다형성(polymorphism)과 인터페이스를 사용하여 다양한 타입의 객체를 유연하게 처리할 수 있는 기반을 제공합니다.
이 답변이 박준형님의 질문에 도움이 되었기를 바랍니다.