Java의 동적 메소드 디스패치

Mehvish Ashiq 2024년2월15일
  1. Java의 동적 메소드 디스패치
  2. Java에서 동적 메소드 디스패치의 중요성
  3. Java의 코드 예제와 함께 동적 메서드 디스패치
Java의 동적 메소드 디스패치

이 자습서에서는 Java의 동적 메서드 디스패치에 대해 설명합니다. 기술적인 정의와 중요성에 대해 설명하고 코드 예제와 함께 설명합니다.

Java의 동적 메소드 디스패치

단어를 분해하여 Dispatch를 호출할 함수(메소드)를 결정하는 것으로 생각합시다. “동적"이라는 단어는 런타임에 결정됨을 나타냅니다.

가장 간단한 말로 실행해야 하는 함수/메서드가 런타임에 결정된다고 말할 수 있습니다.

기술적 정의를 고려할 때 동적 메서드 디스패치(런타임 다형성이라고도 함)는 컴파일 시간 대신 런타임에 재정의된 메서드에 대한 호출을 해결하는 데 사용되는 메커니즘입니다.

참조를 사용하여 자식 클래스에서 재정의된 메서드를 호출하면 Java는 참조하는 개체의 유형에 따라 실행할 메서드를 결정합니다. 다음 두 코드 스크린샷을 사용하여 정의를 이해합시다.

Shape, RectangleMain 클래스라는 세 개의 클래스가 있는 다음 스크린샷에 초점을 맞춥니다. Shape는 상위 클래스이고 Rectangle은 하위 클래스입니다.

main 메소드에는 ShapeRectangle 유형의 두 개체가 있으며 해당 참조를 shaperectangle 변수에 저장합니다.

이러한 변수는 해당 클래스의 display() 메서드를 호출합니다. 예를 들어 shape.display()를 컴파일할 때 shape 클래스의 display()shape 클래스의 참조를 포함하므로 shape 클래스의 display()가 호출되는 것이 결정됩니다.

Java의 동적 메소드 디스패치 - 정의 파트 1

이제 다음 스크린샷과 같이 코드를 변경합니다. 여기에서 main 메소드는 Shape 클래스에 대한 객체와 Rectangle 클래스에 대한 객체를 포함하지만 둘 다(변수 shaperectangle)에는 Shape 클래스에 대한 참조가 포함됩니다.

그렇다면 어떤 재정의된 메서드를 호출해야 하는지 프로그램이 어떻게 결정할까요? 여기에서 동적 메서드 디스패치가 역할을 합니다.

여기서 Java는 참조하는 객체의 유형에 따라 실행해야 하는 메소드를 결정합니다.

객체가 Rectangle 유형이면 Rectangle 클래스의 display()가 호출되고, 객체가 Shape 유형이면 Shapedisplay() 메서드가 호출됩니다. 클래스가 호출됩니다. 그리고 이러한 모든 결정은 런타임에 이루어집니다.

이것을 우리는 런타임 다형성 또는 동적 메소드 디스패치라고 부릅니다.

Java의 동적 메소드 디스패치 - 정의 파트 2

Java에서 동적 메소드 디스패치의 중요성

다음 사항은 동적 메서드 디스패치 사용의 중요성을 높입니다.

  1. 동적 메소드 디스패치는 Java가 런타임 다형성에 필요한 메소드 재정의를 지원하도록 합니다.
  2. 자식 클래스가 기능을 통합하고 프로젝트 요구 사항에 따라 구현을 업데이트할 수 있습니다.
  3. 상위 클래스가 하위 클래스와 공유할 함수/메서드를 정의하고 이러한 하위 클래스가 함수의 구현을 업데이트할 수 있도록 합니다.

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

여기에서 RectangleTriangle 클래스는 Shape 클래스를 확장합니다. 이 클래스에는 main 메서드라고 하는 display() 메서드가 있습니다.

main 메소드에는 Rectangle 유형과 Triangle 유형에 대한 두 개의 개체가 있지만 참조 변수 rectangletriangleShape라는 동일한 상위 클래스를 참조합니다.

어떤 함수가 호출되는지 어떻게 알 수 있습니까? 여기서 동적 디스패치 방식이 등장합니다.

다음 두 코드 코드에서도 동적 바인딩 및 업캐스팅을 사용하고 있음을 기억하십시오.

Shape rectangle = new Rectangle();
Shape triangle = new Triangle();

동적 바인딩은 런타임 시 메서드 호출을 해결하기 위해 객체(여기서는 new Rectangle()new Triangle()인 클래스 인스턴스)를 사용합니다.

여기에서는 상위 클래스 참조 변수(rectangletriangle)가 RectangleTriangle 하위 클래스를 참조하기 때문에 업캐스팅도 사용됩니다.

Mehvish Ashiq avatar Mehvish Ashiq avatar

Mehvish Ashiq is a former Java Programmer and a Data Science enthusiast who leverages her expertise to help others to learn and grow by creating interesting, useful, and reader-friendly content in Computer Programming, Data Science, and Technology.

LinkedIn GitHub Facebook

관련 문장 - Java Method