티스토리 뷰

728x90
반응형

다이나믹 메소드 디스패치란?

Dynamic Method Dispatch


  • 다이나믹 메소드 디스패치란 자바의 테크닉 중 하나로, 런타임시에 오버라이딩 된 메서드가 실행되는 것을 의미합니다.
  • dynamic은 runtime의 동의어로 사용되며, dispatch는 어떤 메서드를 호출할지 결정하는 것입니다.
  • 자바는 런타임 시 객체를 생성하고, 컴파일 시에는 생성할 객체 타입에 대한 정보만 가지고 있습니다. 이에따라 이 과정은 정적(static)과정과 동적(dynamic)과정이 있습니다.

 

Static Dispatch(정적 디스패치)


  • 컴파일 시점에서, 컴파일러가 어떤 클래스의 메서드를 호출할 것이라고 명확하게 알고 있는경우
  • 컴파일 시 생성된 바이트 코드에도 해당 정보가 남아있습니다.
  • 런타임(실행 시점)이 되지 않아도 미리 결정하는 개념입니다.
  • 메서드를 오버라이딩하여 사용하는 경우 매개변수의 타입이나 리턴타입 등에 따라 어떤 메서드를 호출할지 알수 있는 경우
class Job {

    void myJob(){
             
     }
}

class Student extends Job{

    @Override
    void myJob() {
        System.out.println("Student");
    }
}

class Teacher extends Job{

    @Override
    void myJob() {
        System.out.println("Teacher");
    }
}

public class Example {
    public static void main(String[] args) {
       Student student = new Student();
       Teacher teacher = new Teacher();

       student.myJob();
       teacher.myJob();
    }
}

 

바이트 코드로 확인하기

 

 

Dynamic Dispatch(동적 디스패치)


  • 정적 디스패치와는 반대로 컴파일러가 어떠 메서드를 호출하는지 모르는 경우입니다.
  • 동적 디스패치는 호출할 메서드를 런타임 시점에 결정하게 됩니다.
  • 인터페이스나 추상 클래스에 정의된 추상 메서드를 사용하는 경우입니다.
  • 인터페이스 또는 추상 클래스를 선언하고 상속/구현 하는 하위 클래스 생성
    • 컴파일러가 알고 있는 타입에 대한 정보를 토대로 런타임 시 해당 타입의 객체를 생성하고 메서드 호출
  • 런타임 전에는 객체가 생성되지 않기 때문에 Job student = new Student(); 를 해도 컴파일러가 Student의 객체가 생성된지 알 수 없으므로 Job이 정의한 myJob() 메서드로만 접근할 수 있습니다.
abstract class Job {

    abstract void myJob();
}

class Student extends Job{

    @Override
    void myJob() {
        System.out.println("Student");
    }
}

class Teacher extends Job{

    @Override
    void myJob() {
        System.out.println("Teacher");
    }
}

public class Example {
    public static void main(String[] args) {
        Job student = new Student();
        Job teacher = new Teacher();

        student.myJob();
        teacher.myJob();
    }
}

 

바이트 코드로 확인하기

 

Double Dispatch(더블 디스패치)


  • Dynamic Dispatch를 두 번 하는 것을 의미합니다.
  • Post 클래스의 구현체 Text, Picture에서 어떤 클래스의 postOn 메서드를 사용할 건지(Dynamic Dispatch 한번 사용)
  • postOn 메서드에서 인자로 선택된 클래스의 post 메서드를 사용할지(Dynamic Dispatch 한번 사용)
public class Dispatch {

    interface Post {
        void postOn(Sns sns);
    }

    interface Sns {
        void post(Text text);
        void post(Picture picture);
    }

    static class Text implements Post{
        @Override
        public void postOn(Sns sns) {
            sns.post(this);
        }
    }

    static class Picture implements Post{
        @Override
        public void postOn(Sns sns) {
            sns.post(this);
        }
    }

    static class Naver implements Sns {
        @Override
        public void post(Text text) {
            System.out.println("Naver-text");
        }

        @Override
        public void post(Picture picture) {
            System.out.println("Naver-picture");
        }
    }

    static class Kakao implements Sns{
        @Override
        public void post(Text text) {
            System.out.println("Kakao-text");
        }

        @Override
        public void post(Picture picture) {
            System.out.println("Kakao-picture");
        }
    }

    public static void main(String[] args) {
        List<Post> postList = Arrays.asList(new Text(), new Picture());
        List<Sns> snsList = Arrays.asList(new Naver(), new Kakao());

        postList.forEach(post -> snsList.forEach(sns -> post.postOn(sns)));
    }
}

=====================결과=====================
Naver-text
Kakao-text
Naver-picture
Kakao-picture

솔직히 이거는 무슨 말인지 하나도 모르겠다,,,, 더 공부를 해보고 강의도 들어봐야겠다

어렵다!

728x90
반응형