Java의 동적 메소드 디스패치
![Java의 동적 메소드 디스패치](/img/Java/feature-image---dynamic-dispatch-java.webp)
이 자습서에서는 Java의 동적 메서드 디스패치에 대해 설명합니다. 기술적인 정의와 중요성에 대해 설명하고 코드 예제와 함께 설명합니다.
Java의 동적 메소드 디스패치
단어를 분해하여 Dispatch
를 호출할 함수(메소드)를 결정하는 것으로 생각합시다. “동적"이라는 단어는 런타임에 결정됨을 나타냅니다.
가장 간단한 말로 실행해야 하는 함수/메서드가 런타임에 결정된다고 말할 수 있습니다.
기술적 정의를 고려할 때 동적 메서드 디스패치(런타임 다형성이라고도 함)는 컴파일 시간 대신 런타임에 재정의된 메서드에 대한 호출을 해결하는 데 사용되는 메커니즘입니다.
참조를 사용하여 자식 클래스에서 재정의된 메서드를 호출하면 Java는 참조하는 개체의 유형에 따라 실행할 메서드를 결정합니다. 다음 두 코드 스크린샷을 사용하여 정의를 이해합시다.
Shape
, Rectangle
및 Main
클래스라는 세 개의 클래스가 있는 다음 스크린샷에 초점을 맞춥니다. Shape
는 상위 클래스이고 Rectangle
은 하위 클래스입니다.
main
메소드에는 Shape
및 Rectangle
유형의 두 개체가 있으며 해당 참조를 shape
및 rectangle
변수에 저장합니다.
이러한 변수는 해당 클래스의 display()
메서드를 호출합니다. 예를 들어 shape.display()
를 컴파일할 때 shape
클래스의 display()
가 shape
클래스의 참조를 포함하므로 shape
클래스의 display()
가 호출되는 것이 결정됩니다.
이제 다음 스크린샷과 같이 코드를 변경합니다. 여기에서 main
메소드는 Shape
클래스에 대한 객체와 Rectangle
클래스에 대한 객체를 포함하지만 둘 다(변수 shape
및 rectangle
)에는 Shape
클래스에 대한 참조가 포함됩니다.
그렇다면 어떤 재정의된 메서드를 호출해야 하는지 프로그램이 어떻게 결정할까요? 여기에서 동적 메서드 디스패치가 역할을 합니다.
여기서 Java는 참조하는 객체의 유형에 따라 실행해야 하는 메소드를 결정합니다.
객체가 Rectangle
유형이면 Rectangle
클래스의 display()
가 호출되고, 객체가 Shape
유형이면 Shape
의 display()
메서드가 호출됩니다. 클래스가 호출됩니다. 그리고 이러한 모든 결정은 런타임에 이루어집니다.
이것을 우리는 런타임 다형성 또는 동적 메소드 디스패치라고 부릅니다.
Java에서 동적 메소드 디스패치의 중요성
다음 사항은 동적 메서드 디스패치 사용의 중요성을 높입니다.
- 동적 메소드 디스패치는 Java가 런타임 다형성에 필요한 메소드 재정의를 지원하도록 합니다.
- 자식 클래스가 기능을 통합하고 프로젝트 요구 사항에 따라 구현을 업데이트할 수 있습니다.
- 상위 클래스가 하위 클래스와 공유할 함수/메서드를 정의하고 이러한 하위 클래스가 함수의 구현을 업데이트할 수 있도록 합니다.
Java의 코드 예제와 함께 동적 메서드 디스패치
예제 코드:
class Shape {
Shape() {}
void display() {
System.out.println("I am in the Shape class");
}
}
class Rectangle extends Shape {
Rectangle() {}
void display() {
System.out.println("I am in the Rectangle class");
}
}
class Triangle extends Shape {
Triangle() {}
void display() {
System.out.println("I am in the Triangle class");
}
}
public class Main {
public static void main(String args[]) {
Shape rectangle = new Rectangle();
Shape triangle = new Triangle();
rectangle.display();
triangle.display();
}
}
출력:
I am in the Rectangle class
I am in the Triangle class
여기에서 Rectangle
및 Triangle
클래스는 Shape
클래스를 확장합니다. 이 클래스에는 main
메서드라고 하는 display()
메서드가 있습니다.
main
메소드에는 Rectangle
유형과 Triangle
유형에 대한 두 개의 개체가 있지만 참조 변수 rectangle
및 triangle
은 Shape
라는 동일한 상위 클래스를 참조합니다.
어떤 함수가 호출되는지 어떻게 알 수 있습니까? 여기서 동적 디스패치 방식이 등장합니다.
다음 두 코드 코드에서도 동적 바인딩 및 업캐스팅을 사용하고 있음을 기억하십시오.
Shape rectangle = new Rectangle();
Shape triangle = new Triangle();
동적 바인딩은 런타임 시 메서드 호출을 해결하기 위해 객체(여기서는 new Rectangle()
및 new Triangle()
인 클래스 인스턴스)를 사용합니다.
여기에서는 상위 클래스 참조 변수(rectangle
및 triangle
)가 Rectangle
및 Triangle
하위 클래스를 참조하기 때문에 업캐스팅도 사용됩니다.