메서드 디스패치란 어떤 메서드를 호출할지 결정하여 실제로 실행시키는 과정이다.
자바는 런타입시 객체를 생성하고 컴파일 시에는 생성할 객체 타입에 대한 정보만 보유한다.
이 과정은 static(정적)과 dynamic(동적)이 있다.
컴파일 시점에서 컴파일러가 특정 메소드를 호출할 것이라고 명확하게 알고 있는 경우이다.
class Parent {
public void print() {
System.out.println("Hello");
}
public void print(String greeting) {
System.out.println(greeting);
}
}
public class StaticDispatch {
public static void main(String[] args) {
Parent parent = new Parent();
parent.print();
parent.print("hihi");
}
}
결과
런타임이 아닌 컴파일타임에 컴파일러 사용자 바이트코드 모두 어떤 메서드가 실핼될지 알고 있다.
정적 디스패치와 반대로 컴파일러가 어떤 메서드를 호출하는지 모르는 경우다. 동적 디스패치는 호출할 메서드를 런타임 시점에서 결정한다.
class Animal {
public void cry() {
System.out.println("냐옹");
}
}
class Dog extends Animal {
public void cry() {
System.out.println("멍멍");
}
}
public class DynamicDispatch {
public static void main(String[] args) {
Animal dog = new Dog();
dog.cry();
}
}
결과
객체의 선언 타입은 Animal이고 생성타입은 Dog이다 컴파일 시간에는 crt() 메소드가 Animal.cry()일지 Dog.cry()일지 판단하지 못한다.
런타임 시점에 어떤 객체가 생성되어 할당되었는지 판단하게 된다.