-
Java - 다이나믹 메서드 디스패치(Dynamic Method Dispatch)Java/java study 2022. 1. 16. 18:36반응형
Java - 메서드 오버로딩과 오버라이딩 :: 울타리 (tistory.com)
다이나믹 메서드 디스패치를 이해하기 위해서는 우선 오버라이딩에 대해 알아야한다.
다이나믹 메서드 디스패치(Dynamic Method Dispatch)
다이나믹 메서드 디스패치란 어떤 메서드를 호출할지 결정하여 실제로 실행시키는 과정이다. 자바는 컴파일 시에는 생성할 객체 타입에 대한 클래스 정보를 보유하고, 런타임 시 객체를 생성한다. 따라서 상속 관계 클래스들이 오버라이딩된 메서드가 있으면 컴파일 시에는 클래스 정보만을 저장하기 때문에 아직 참조변수가 어느 객체의 주소를 저장할지는 안정해진 상태이다. 때문에 어느 객체의 메서드를 호출할지 모르게 된다.
런타임 시점에 컴파일러는 해당 참조변수가 어느 클래스의 타입을 참조하는지
정적 메서드 디스패치(Static Method Dispatch)
컴파일 시점에서, 컴파일러가 특정 메소드를 호출할 것이라고 명확하게 알고 있는 경우이다.
class SuperClass{ void printImp(){ System.out.println("SuperClass printImp호출"); } } class Main{ public static void main(String[] args){ new SuperClass.printImp(); } }
동적 메서드 디스패치(Dynamic Dispatch)
컴파일러가 컴파일 단계에서 어떤 메소드를 호출할지 모르는 경우이다. 이 경우 런타임 시점에서 컴파일러가 알게 된다.
class SuperClass{ void printImp(){ System.out.println("SuperClass printImp호출"); } } class SubClass1 extends SuperClass{ void printImp(){ System.out.println("SubClass2 printImp호출"); } } class SubClass2 extends SuperClass{ void printImp(){ System.out.println("SubClass2 printImp호출"); } } class Main{ public static void main(String[] args){ SuperClass superC1 = new SuperClass(); SuperClass superC2 = new Sub1Class(); SuperClass superC3 = new Sub2Class(); superC1.printImp(); //SuperClass의 printImp 호출 superC2.printImp(); //Sub1Class의 printImp 호출 superC3.printImp(); //Sub2Class의 printImp 호출 } }
반응형'Java > java study' 카테고리의 다른 글
Java - Object 클래스 (0) 2022.01.16 Java - 추상 클래스(Abstract Class) (0) 2022.01.16 Java - 상속과 super 키워드 (0) 2022.01.16 Java - 생성자(Constructor)와 this 키워드 (0) 2022.01.09 Java - 메서드 오버로딩과 오버라이딩 (0) 2022.01.09