다이나믹 메소드 디스패치

이규은·2021년 10월 5일
0

상속

목록 보기
4/6

메서드 디스패치란 어떤 메서드를 호출할지 결정하여 실제로 실행시키는 과정이다.
자바는 런타입시 객체를 생성하고 컴파일 시에는 생성할 객체 타입에 대한 정보만 보유한다.
이 과정은 static(정적)과 dynamic(동적)이 있다.

정적 디스패치

컴파일 시점에서 컴파일러가 특정 메소드를 호출할 것이라고 명확하게 알고 있는 경우이다.

class Parent {
    public void print() {
        System.out.println("Hello");
    }

    public void print(String greeting) {
        System.out.println(greeting);
    }
}

public class StaticDispatch {
    public static void main(String[] args) {
        Parent parent = new Parent();
        parent.print();
        parent.print("hihi");
    }
}

결과

런타임이 아닌 컴파일타임에 컴파일러 사용자 바이트코드 모두 어떤 메서드가 실핼될지 알고 있다.

동적 디스패치

정적 디스패치와 반대로 컴파일러가 어떤 메서드를 호출하는지 모르는 경우다. 동적 디스패치는 호출할 메서드를 런타임 시점에서 결정한다.

class Animal {
    public void cry() {
        System.out.println("냐옹");
    }
}

class Dog extends Animal {
    public void cry() {
        System.out.println("멍멍");
    }
}

public class DynamicDispatch {
    public static void main(String[] args) {
        Animal dog = new Dog();
        dog.cry();
    }
}

결과

객체의 선언 타입은 Animal이고 생성타입은 Dog이다 컴파일 시간에는 crt() 메소드가 Animal.cry()일지 Dog.cry()일지 판단하지 못한다.
런타임 시점에 어떤 객체가 생성되어 할당되었는지 판단하게 된다.

profile
안녕하세요

0개의 댓글