본문 바로가기
Delvelopment/Java

[Java] Method Dispatch (Static Dispatch, Dynamic Dispatch, Double Dispatch)

by 제제킴 2022. 1. 23.
반응형

Method Dispatch란, 어떤 메소드를 실행할지를 결정하여 실제로 실행시키는 과정이다. Java는 런타임시 객체를 생성하고, 컴파일 시에는 생성할 객체 타입에 대한 정보만 보유한다. static(정적)과 dynamic(동적)인 상황이 이루어진다.

Method Dispatch는, 세 가지 Dispatch인 Static Dspatch, Dynamic Dispatch, Double Dispatch로 구성한다.

정적 디스패치 (Static Dspatch)

컴파일 시점에서, 컴파일러가 특정 메소드의 호출할 것이라는 것을 명확히 아는 경우이다. 컴파일 시 생성된 바이트 코드에 이 정보가 남아있는데, 오버로딩(OverLoading)을 하는 경우 인자의 타입이나 리턴타입 등에 따라 미리 알기 때문이다.

public class A{
	public void show(){
		log.info("show");
	}
}

// 오버로딩
public class B extends A{
	public void show(){
		log.info("show B");
	}
}

// Static Dispatch
public static void main(String[] args){
	B b = new B();
	b.show();
}

 

다이나믹 디스패치 (Dynamic Dispatch)

컴파일 시점에 어떤 메소드를 호출하는지 모르며, 추상 타입의 메소드만 호출하는 것으로만 알 고 있다. 런타임 시점에 할당된 객체의 타입을 보고 메소드를 실행한다.

Interface, Abstract Class에서 정의된 abstract method를 호출하는 경우 이다.

public interface My{
	void show();
}

public class A implements My{
	@Override
	public void show(){
		log.info("Show");
	}
}

// Dynamic Dispatch
public static void main(String[] args){
	My m = new A();
	m.show();
}

 

더블 디스패치 (Double Dispatch)

다이나믹 디스패치를 두번 하는 것을 의미한다.

방문자 패턴(Visitor Pateern), 여러 객체에 대해 각 객체의 동작들을 지정하는 패턴에서 사용된다. 일반적으로 OOP는 객체가 스스로 행위를 수행하게 하지만, 경우에따라 객체의 행위 수행을 외부 클래스에 위임하는 경우이다. 즉, 로직과 구조를 분리해 구조를 수정하지 않고 새로운 동작을 기존 객체 구조에 추가하는 경우이다.

반응형

댓글