작성
·
308
·
수정됨
0
[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)
[질문 내용]
김영한님, 안녕하세요. 양질의 강의 덕분에 열심히 공부하고 있습니다. 감사합니다. ^^
다형성과 메서드 오버라이딩 내용에서 헷갈리는 부분이 있어 질문드리고 싶어요.
Parent parent = new Child();
parent.childMethod();
가 불가능한 이유에 대해, 강의를 통해 다음과 같이 이해했습니다.
1. Parent 클래스 코드에는 Child와 관련된 코드가 없다. 따라서 Parent는 Child가 본인을 상속했는지 모르기에 .을 통해 객체를 찾아가도 childMethod는 호출할 수 없다.
.을 통해 객체를 찾아가서 메서드를 호출할 때, 상속 관계는 부모로만 찾아서 올라갈 수 있다.
이 때 상속 관계가 부모로만 찾아서 올라갈 수 있는 이유가 무엇이냐? 묻는다면, 결국 1번 설명이 답이 될 수 있으므로 1번 설명이 중요하다고 생각했습니다.
그런데 메서드 오버라이딩을 생각하면 1번 설명에 문제가 생깁니다.
Parent 클래스 코드에 Child와 관련된 코드가 없음에도 불구하고, Child 클래스의 메서드를 찾아갈 수 있기 때문입니다.
혼자 고민해보다가 내린 결론은 다음과 같습니다.
컴파일 시점에서는 Parent 클래스 입장에서 본인의 메서드가 오버라이딩 됐는지 여부를 모르지만, 자바의 어떤 원리에 의해 런타임 시점에서는 알 수 있기 때문에 Child타입 객체를 Parent타입의 참조변수가 가리키고 있을지라도, Child 클래스에 오버라이딩 된 메서드를 찾아갈 수 있다.
혹시 제가 이해한 내용이 맞는지, 틀렸다면 어떻게 메서드 오버라이딩만 특별히 상속 관계임에도 자식쪽으로 찾아서 내려갈 수 있는지 알고 싶습니다!
오늘도 좋은 하루 되세요. 감사합니다! :)
답변 2
1
동균님, 안녕하세요~ 답변 감사드립니다!
다만, 제 질문의 의도가 잘못 전달된 것 같아요.
parent 변수가 Child 객체를 참조하고 있다는 사실은 이해하고 있습니다. 하지만 parent 변수가 Child 객체 고유의 메서드를 실행하지 못하는 이유는, Parent 클래스 코드에 Child 클래스에 대한 정보가 없기 때문이라고 생각하는데요.
그럼에도 불구하고 parent 참조변수를 이용해 Child 클래스가 오버라이딩한 메서드는 실행할 수 있는 원리에 대해 궁금했습니다.
0
Parent parent = new Child();
위 예제의 이 부분에서 자바는 해당 매서드를 수행할 실제 객체가 Child 임을 알 수 있습니다.
상위 Parent 타입으로 사용하긴 하지만, 실제 인스턴스는 new Child() 선언을 통해 Child 로 명시 해 주었기 때문입니다.
즉 타입은 부모의 것이지만, 실제 수행하는 객체는 new Child() 로 생성된 Child 클래스의 객체인 것이죠.
도움이 되었으면 좋겠습니다. 감사합니다.
아! 제가 질문의 의도를 잘못 이해했습니다 ㅎㅎ 자세히 설명해주셔서 감사합니다.
말씀하신 부분이 맞습니다! 컴파일 시점에는 parent 인스턴스는 Parent 타입으로 사용되지만, 런타입 시점에서 실제 참조될 때에는 Child 타입으로 참조됩니다. 따라서 런타임 시점에 실제 호출되는 것은 Child 의 매서드입니다.
도움이 되었으면 좋겠습니다. 감사합니다!