본문 바로가기

Java 특강

오버라이딩이 내부에서 구현되는 법

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 특강' 카테고리의 다른 글