Study/Java
[Java] 메서드 디스패치란?
짱이08
2023. 11. 7. 23:35
메서드 디스패치
메서드 호출 시 실제로 실행될 메서드를 결정하는 과정을 메서드 디스패치라고 합니다.
자바에서는 정적 디스패치(Static Dispatch)와 동적 디스패치(Dynamic Dispatch)의 두 가지 방법으로
메서드 디스패치를 구현할 수 있습니다.
메서드 디스패치가 왜 필요한가?
메서드 디스패치는 다형성을 구현하기 위한 기능으로, 여러 클래스가 동일한 메서드 이름을 가지고 있지만
객체의 실제 타입에 따라 다르게 동작할 수 있도록 합니다.
정적 디스패치
정적 디스패치는 컴파일 시간에 어떤 메서드를 호출할지 결정됩니다.
컴파일러는 호출할 메서드를 정확하게 알고 있는 경우에 정적 디스패치를 사용합니다.
컴파일 시점에 어떤 메서드를 호출할지 결정되기 때문에 런타임에는 메서드 디스패치가 필요하지 않습니다.
public class Print {
public void print(int x) {
System.out.println(x);
}
public static void main(String[] args) {
Print p = new Print();
p.print(10);
}
}
동적 디스패치
동적 디스패치는 런타임 시에 객체의 실제 타입을 확인하고 해당 타입에서 오버라이딩된 메서드를 호출합니다.
아래의 코드를 보면 animal.makeSound() 의 호출은 실제 객체가 Dog이기 때문에 Dog의 makeSound()메서드가 호출됩니다.
즉 컴파일 시점에 어떤 메서드를 호출해야 하는지 모르고 런타임 시점에 할당되는 객체의 메소드를 호출합니다.
class Animal {
public void makeSound() {
System.out.println("Some sound");
}
}
class Dog extends Animal {
@Override
public void makeSound() {
System.out.println("Bark");
}
}
public class Main {
public static void main(String[] args) {
Animal animal = new Dog();
animal.makeSound(); // 동적 디스패치, Dog 클래스의 makeSound() 메서드 호출
}
}
결론
메서드 디스패치는 다형성을 가능하게 하며, 코드의 유연성과 확장성을 높입니다.
정적 디스패치는 컴파일 시간에 결정되며, 동적 디스패치는 런타임 시간에 객체의 실제 타입을 기반으로 결정됩니다.