728x90
class Parent{
void sayHi(){
System.out.println("안녕?");
}
void sayBye(){
System.out.println("안녕!");
}
}
class Child extends Parent{
void sayHi(){
System.out.println("HI?");
}
void play(){
System.out.println("열심히논다");
}
}
class Child2 extends Parent{
}
public class Test{
public static void main(String[] args){
Parent p = new Child();
p.sayHi(); // HI?
}
}
오버라이드란?
- 부모타입의 정의된 메서드를 하위타입에서 상속받아 상위 타입의 메서드와는 다른 방식으로 구현해서 사용합니다.
질문
- sayHi()가 오버라이드 된 것은 알겠는데 분명 상위 타입의 참조변수로 하위타입의 인스턴스를 참조한 상태(업캐스팅)에서 메서드를 호출했는덷 어떻게 하위 타입의 오버라이드된 메서드로 인식하고 호출할 수 있을까?
- 코드는 컴파일러를 통해 클래스 파일로 변환되고 런타임되면서 JVM내에서 실행되게 된다.
- JVM내에 인터프리터에 의해 코드를 실행하고자 하는데 클래스 파일이 메서드 영역에 없을때 클래스로더에게 동적 요청을 하게 됩니다.
- 클래스 로더에 의해 클래스들은 메서드 영억에 담기게 되고, Virtual Method Table을 통해 메서드가 담긴 주소값을 담습니다.
- 부모에게 상속받아 오버라이딩한 메서드는 부모 메서드와는 다른 주소값을 받게 되고, 오버라이딩을 하지 않는다면 부모와 같은 주소값을 받게 됩니다.
- Heap영역에 생긴 인스턴스에 담긴 Virtual Method Table을 통해 메서드는 실행되게 됩니다.

'Java 특강' 카테고리의 다른 글
Java 코드가 실행되는 과정 (0) | 2024.10.01 |
---|---|
프로세스와 스레드의 차이점 (2) | 2024.09.27 |
객체 지향이란 무엇인가요? (1) | 2024.09.26 |