[Java] Method Overriding - 개념부터 JVM에서 구현까지

junjun·2024년 1월 2일
0

Java

목록 보기
2/3
post-thumbnail

이 글은
1/2 ~ 1/9 일까지 시간을 거쳐 완성될 예정입니다.

도입

  • 내가 오래 전부터 들고있던 의문이 있다.
    => Reference Type 변수는 JVM의 Stack 영역에 위치하고,
    동적 할당된 데이터 그 자체는 Heap 영역에 위치한다.
    그리고 Class 내부의 메서드들은 JVM의 Method 영역에 위치한다.
    메서드 이름 그 자체는 해당 Method 영역의 주소값을 의미한다.
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.

메서드 오버로딩이 컴파일 타임시의 다형성을 지원한다면,
오버라이딩은 런타임에 일어나는 다형성 지원한다 할 수 있겠다.

다형성 ( Poly + Morphism )

< 화학 >

  • "동일한 화학 조성(組成)을 가진 물질로서, 결정 구조가 서로 다른 것"
  • 같은 화학 성분 을 가진 물질이, 압력이나 온도 변화에 따라 서로 다른 결정 구조를 이루는 것
  • 탄소로 되었지만, 상황에 따라 모양이 달라진 흑연과 다이아몬드의 관계

컴퓨터과학에서는,
하나의 형태가 여러 개로 치환될 수 있음을 의미한다 할 수 있겠다.
하나의 형태의 메서드가 상황에 따라, 여러 기능으로 세분화될 수 있다 ( 메서드 오버로딩 )
하나의 형태의 클래스로 선언된 타입 변수가 상황에 따라, 본인을 포함한 여러 하위 클래스로부터 나온 객체를 가리키고 사용할 수 있다.

Phyiscal Way to implement Method Overriding

[ 참고자료 ]
https://dzone.com/articles/how-does-jvm-handle-polymorphism-method-overloadin

0개의 댓글