자바[JAVA] : 다이나믹 메서드 디스패치 (Dynamic Method Dispatch)

2021. 1. 28. 03:07Java

반응형

● 다이나믹 메서드 디스패치 (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 위배) 객체의 행위 수행을 외부 클래스에 위임. 이 때 사용하는 디자인패턴 종류는 전략패턴, 커맨드패턴, 방문자 패턴

더블 디스패치는 방문자 패턴과 밀접한 관계에 있다. 

**** 다른 블로그를 찾아보아도 코드 면에서 이 더블 디스패치를 언제 쓰는지, 어떻게 적용해야 할지, 언제 어디에 사용해야할지 모르는 부분이 너무 많다. 설계 하기전에 추상과 인터페이스의 바운더리를 구조화 시켜서 이해해야만 이 패턴을 사용 할 수 있을거같다.... 조금 더 공부해야한다..

추가로 www.bsidesoft.com/2843

방문자 패턴의 예제, 더블 디스패치를 활용한 수정 예제등을 찾아서 공부해야 겠다.

반응형

'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