케네스로그

[Java] 메소드 디스패치 본문

Dev/Java

[Java] 메소드 디스패치

kenasdev 2022. 2. 16. 22:11
반응형

메소드 디스패치

참조 https://blog.naver.com/swoh1227/222181505425

메소드 디스패치는 런타임에 어떤 메소드를 사용할것인지 정해지는 방법을 말합니다.

 

 

정적 메소드 디스패치 static method dispatch

public class Vehicle{
	public void move() {
		System.out.println("이동중");
	}
}

public class Bicycle extends Vehicle {
	public void move() {
		System.out.println("페달 밟으며 이동중");
	}
}

public class Car extends Vehicle {
	public void move() {
		System.out.println("엑셀 밟으며 이동중");
	}
}

..
Car car = new Car();
car.move();
Bicycle bike = new Bicycle();
bike.move();

car변수와 bike변수 각각 move()를 호출할 때, 오버라이딩된 각각의 move()메소드가 호출될 것입니다.

컴파일러는 부모의 메소드가 아닌 오버라이딩된 메소드를 호출하게 되고, 이러한 메소드 호출방식을 정적 메소드 디스패치라고 합니다.

다음으로는 메소드 디스패치의 다른 방식을 알아보겠습니다.

 

 

다이나믹 메소드 디스패치

다이나믹 메소드 디스패치(dynamic method dispatch)는 오버라이딩된 메소드가 컴파일타임이 아닌 런타임 시간에 결정되는 것을 말합니다. 이것은 다형성(polymorphism)의 핵심이 되죠.

자바에서는 부모 클래스 참조 변수가 자식 클래스 객체를 참조 할 수 있습니다. 즉, 오버라이딩된 메소드를 호출하면, 부모 클래스의 메소드가 참조되어, 부모와 자식 메소드 중 어떤 메소드가 사용될지 결정된다는 것입니다.

참조 (https://leemoono.tistory.com/20)

위의 블로그에서 확인해본 바,

오버라이딩된 메소드를 사용하게 되면, 해당 메소드가 어떤 타입의 클래스의 메소드인지 결정되는게 다이나믹 메소드 디스패치라고 부르며, 이 과정은 런타임에 이루어집니다.

public class Test {
    Vehicle thing;

    Test(Vehicle something) {
        this.thing = something;
    }

    void move() {
        thing.move();
    }
}

interface Vehicle {
    void move();
}

class Car implements Vehicle {
    public void move(){
        System.out.println("car is moving");
    };
}

class Bicycle implements Vehicle {
    public void move() {
        System.out.println("bicycle is moving");
    }
}
...
Car car = new Car();
Test t = new Test(car);
t.move(); // 어떤 move가 실행될지는 런타임때 결졍된다.

 

위의 예시에서, Test클래스의 객체 thing의 타입은 Vehicle입니다. 이때, Test클래스는 어떤 Vehicle이 올지 모릅니다. Car 또는 Bicycle, 아니면 Airplane, Bus 등 다른 Vehicle 클래스를 구현한 클래스가 존재할지도 모릅니다.

이렇게 컴파일러가 어떤 객체가 들어올지 모르는, 어떤 메소드를 사용하게될지 모르는 상황에서 다이나믹 메소드 디스패치가 이루어지게 됩니다.

반응형

'Dev > Java' 카테고리의 다른 글

[Java] 인터페이스  (0) 2022.02.20
[Java] 패키지  (0) 2022.02.18
[Java] 상속, super()  (1) 2022.02.15
[Java] 객체의 생성, 인스턴스화, 생성자, this 키워드  (0) 2022.02.09
[Java] 메소드, 접근제어자  (0) 2022.02.08