이 글은
1/2 ~ 1/9 일까지 시간을 거쳐 완성될 예정입니다.
Parent p = new Child();
여기서 Parent의 메소드 method1()을 Child가 오버라이드 하였을 때,
왜 Child 클래스의 method1()의 주소로 동작하지 않는가? 그 내부 구현이 어떻게 돌아가는걸까?
Virtual Method Table이라는 것이 있다고 하는데, 그것은 Heap 메모리의 객체 안에 존재하는가?
왜 Parent Class에 존재하는 메서드들을 한정으로 Child 객체의 메서드를 호출할 수 있는 것인가? 이건 Compile Time에 정해져서 그런건가?
왜 그렇게 되는건지 잘 모르겠다.
이 부분을 파보려고 한다!
논리적인 방향으로 오버라이딩을 이해하는 방법은 다음과 같다.
During the compilation phase ,
calling method is considered from the reference type.
컴파일 타임에서는 메서드 호출이 Reference Type을 참고한다는 의미이다.
But at execution time,
Method will be called from the object which the reference is holding
하지만 해당 클래스가 클래스 로더를 통해 JVM에 올라가서,
Execution Engine에 의해 실행될 때 ( 런타임 )
메서드의 호출은 Heap 영역의 데이터 그 자체를 참고하여 호출한다.
즉, 컴파일 타임에는 선언된 변수가 속한 클래스의 메서드를 보고 이를 호출하면 된다 생각하면 되니
Intelij IDEA 에서 호출할 수 있는 메서드가 레퍼런스 타입의 메서드로 한정된다고 볼 수 있겠다.
런타임에서는 JVM이 new 로 할당된 레퍼런스 객체 자체의 타입을 정확히 알 수 있으니,
그에 맞게 오버라이드 된 메서드를 호출한다고 말할 수 있겠다.
논리적인 방식으로 보았을 때는, 참 간단한거 같지만..
그래서 실제로 JVM이 어떻게 메서드 오버라이딩을 내부적으로 처리하는데?를 생각하면
좀 더 복잡해진다.
여담으로, 매서드 오버라이딩과 메서드 오버로딩에 대해 언급해보면..
Also, we know that overloaded methods are not called polymorphic and get resolved at compile time and this is why sometimed method overloading is also known as compile-time polymorphism or early/static binding.
But overridden methods get resolved at runtime because the compiler does not know that, the object which we are assigning to our reference has overridden the method or not.
메서드 오버로딩이 컴파일 타임시의 다형성을 지원한다면,
오버라이딩은 런타임에 일어나는 다형성 지원한다 할 수 있겠다.
< 화학 >
컴퓨터과학에서는,
하나의 형태가 여러 개로 치환될 수 있음을 의미한다 할 수 있겠다.
하나의 형태의 메서드가 상황에 따라, 여러 기능으로 세분화될 수 있다 ( 메서드 오버로딩 )
하나의 형태의 클래스로 선언된 타입 변수가 상황에 따라, 본인을 포함한 여러 하위 클래스로부터 나온 객체를 가리키고 사용할 수 있다.
[ 참고자료 ]
https://dzone.com/articles/how-does-jvm-handle-polymorphism-method-overloadin