2021. 1. 28. 03:07ㆍJava
● 다이나믹 메서드 디스패치 (Dynamic Method Dispatch)
메서드 디스패치(Method Dispatch)
메서드 디스패치란 어떤 메서드를 호출할지 결정하여 실제로 실행시키는 과정이다. 자바는 런타임 시 객체를 생성하고, 컴파일 시에는 생성할 객체 타입에 대한 정보만 보유한다. 이에따라 이 과정은 static(정적)과 dynamic(동적)이 있다.
- Static Dispatch : 컴파일 시점에서, 컴파일러가 특정 메소드를 호출할 것이라고 명확하게 알고있는 경우이다. (정적)
컴파일 시 생성된 바이트 코드에도 이 정보가 그대로 남아있다.
런타임(실행 시점)이 되지 않아도 미리 결정하는 개념이다.
함수를 오버로딩하여 사용하는 경우 인자의 타입이나 리턴타입 등에 따라 어떤 메서드를 호출할지 알 수 있는 경우
public class ACar {
public void print() {
System.out.println("A");
}
}
public class BCar extends ACar { //메소드 오버라이딩 - ACar상속 후 함수 재정의
public void print() {
System.out.println("BCar");
}
}
//ex) 스태틱 메서드 디스패치
public static void main(String[] args) {
BCar bcar = new BCar();
System.out.println(bcar.print()); //BCar를 출력.
}
- Dynamic Dispatch : 정적 디스패치와 반대로 컴파일러가 어떤 메서드를 호출하는지 모르는 경우이다. 동적 디스패치는 호출할 메서드를 런타임 시점에서 결정한다.
인터페이스나 추상 클래스에 정의된 추상 메소드를 호출하는 경우다.
인터페이스 또는 추상클래스로 선언하고 구현/상속 받은 하위 클래스의 인스턴스를 생성.
컴파일러가 알고 있는 타입에 대한 정보를 토대로 런타임 시 해당 타입의 객체를 생성하고 메서드를 호출.
public interface Car {
void print();
}
public class A implements Car {
@Override
public void print() {
System.out.println("A");
}
}
public class B implements Car {
@Override
public void print() {
System.out.println("B");
}
}
// 예시 1
public static void main(String[] args) {
// 다이나믹 메소드 디스패치
Car car = new A();
System.out.println(animal.print());
}
런타임 전에는 객체 생성이 되지 않기 때문에 Car car = new A();를 해도, 컴파일러는 A가 생성됨을 알 수 없으므로 Car가 정의한 print() 메소드만 접근 가능.
- Double Dispatch : Dynamic Dispatch 를 두 번 하는 것을 의미한다.
방문자 패턴 (Visitor Pattern) - 여러 객체에 대해 각 객체의 동작들을 지정하는 패턴 (N:N)
일반적으로 OOP는 객체가 스스로 행위를 수행하게 하지만, 경우에 따라(ex. 확장성 고려, OCP 위배) 객체의 행위 수행을 외부 클래스에 위임. 이 때 사용하는 디자인패턴 종류는 전략패턴, 커맨드패턴, 방문자 패턴
더블 디스패치는 방문자 패턴과 밀접한 관계에 있다.
**** 다른 블로그를 찾아보아도 코드 면에서 이 더블 디스패치를 언제 쓰는지, 어떻게 적용해야 할지, 언제 어디에 사용해야할지 모르는 부분이 너무 많다. 설계 하기전에 추상과 인터페이스의 바운더리를 구조화 시켜서 이해해야만 이 패턴을 사용 할 수 있을거같다.... 조금 더 공부해야한다..
방문자 패턴의 예제, 더블 디스패치를 활용한 수정 예제등을 찾아서 공부해야 겠다.
'Java' 카테고리의 다른 글
자바[JAVA] : final 키워드 (0) | 2021.01.28 |
---|---|
자바[JAVA] : 추상클래스 (0) | 2021.01.28 |
자바[JAVA] : 오버라이딩(Overriding) 이란? (0) | 2021.01.28 |
자바[JAVA] : super 키워드 (0) | 2021.01.28 |
자바[JAVA] : 상속의 특징 (0) | 2021.01.28 |