Post

동적 디스패치 / 정적 디스패치

정적 디스패치

  • 컴파일 타임에 호출 대상 메서드를 연결하는 과정.
  • 메서드 오버로딩(method overloading)과 관련 있음.
  • overloading 된 메서드는, 컴파일러가 메서드 시그니처를 보고 어떤 메서드로 연결할지 결정함.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class StaticDispatchExample {
    public void print(int i) {
        System.out.println("int: " + i);
    }

    public void print(String s) {
        System.out.println("String: " + s);
    }

    public static void main(String[] args) {
        StaticDispatchExample example = new StaticDispatchExample();
        example.print(10);  // print(int i)가 호출됨
        example.print("hello");  // print(String s)가 호출됨
    }
}

동적 디스패치

  • 런타임에 상속 계층 상 실제로 실행되어야 하는 메서드로 연결하는 과정.
  • 상속, override, 다형성과 관련 있음.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Parent {
    void print() {
        System.out.println("Parent");
    }
}

class Child extends Parent {
    @Override
    void print() {
        System.out.println("Child");
    }
}

public class DynamicDispatchExample {
    public static void main(String[] args) {
        Parent obj = new Child();
        obj.print();  // 런타임에 결정: Child 클래스의 print() 호출
    }
}

[!info] 대부분의 객체지향 언어에서 같은 클래스에 속한 객체는 같은 메소드 테이블을 공유한다.
그래서 메소드 테이블은 클래스마다 하나씩만 만들어 두고, 각 객체는 자신의 클래스에 대한 참조를 통해 그 메소드 테이블을 참조하는 방식을 많이 사용한다.
그러나 동적 디스패치를 처리할 때는 대체로 객체별로 자신의 메소드에 대한 테이블을 저장하는 방법을 사용한다.

둘 다 발생하는 경우

  • 정적 디스패치와 동적 디스패치는 배타적인 관계는 아니다.
  • 어떤 메서드가 overloading 되었으면서 하위 클래스에서 override 된 경우, 컴파일 타임에 정적 디스패치 후 런타임에 동적 디스패치 하게 된다.
This post is licensed under CC BY 4.0 by the author.