동적 디스패치 / 정적 디스패치
정적 디스패치
- 컴파일 타임에 호출 대상 메서드를 연결하는 과정.
- 메서드 오버로딩(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.