ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 토비의 봄 (재사용성과 다이나믹 디스패치)
    카테고리 없음 2023. 4. 21. 15:27
    오늘은 토비님이 강의 하신 내용을 정리해보려고 한다. 이야기할게 더 있긴 하지만 오늘은 재사용성과 다이나믹 디스패치에 대해서만 살펴보자.

    dependency

    dependency 란 무엇인가? dependency를 네이버 사전에서 찾아보면 의존, 종속 이라는 단어가 제일 먼저 나온다. 그럼 의존이란 무엇인가? 다시 네이버 사전을보자. 그럼 다른 것에 의지하여 존재함. 이라고 설명한다. 말그대로 어떤것에 의지하는 것을 말한다. 객체지향 프로그램에서 의존이라하면 A(클래스)가 B(클래스)를 의존한다고 말한다. 즉 아래와 같은 상황이다.
    A(클래스) - - - > B(클래스)
    다이어그램으로 그리기는 귀찮아서 그냥 위와 같은 표현을 했다. 저 말은 즉 A가 B에 의존하고 있다라고 설명 할 수 있다. 그럼 의존 관계를 어떻게 발생하나. 1. B가 A의 필드로 사용 될 경우 2. B가 A의 메서드 파라미터로 사용 될 경우 3. B가 A의 로컬 변수로 사용 될 경우 4. B로 메시지를 보냄 위와 같이 네가지로 인해 의존 관계가 발생 할 수 있다. 다시 다이어그램(?)을 보자
    A(클래스) - - - > B(클래스)
    A라는 클래스는 B라는 클래스를 의존하고 있다. 클래스로 의존 하기 때문에 A라는 클래스는 재사용이 어렵다. 아래의 코드를 살펴보자.
    class A {
      private B b;
    
      A(B b) {
        this.b = b;
      }
    
      void print() {
        b.print();
      }
    }
    
    class B {
      public void print() {
        System.out.println("B");
      }
    }
    
    위의 코드는 아까 다이어그램과 같이 A는 B를 의존하고 있다. 물론 지금은 생성자로 의존하지만 다른 방법일 수도 있다. 그리고 재사용이 어렵거나 더 좋은 방법이 있다는 이야기지 재사용을 아예 하지 못한다는 것은 아니다.

    런타임시 결정되는 의존 관계

    다시 위의 코드를 살펴보자. 위의 코드에서 A클래스의 print() 메스드안에 B클래스 print()를 호출 하는 부분이 있다. 만약 위의 코드를 작성하고 컴파일 했을 때 b.print()는 정말로 B클래스의 print()가 실행 될지를 알고 있을까? 맞다. 정답은 알고 있다. 나도 알고 이걸 보는 개발자도 알고 컴파일러도 알고 있다. 우리는 이것을 정적 디스패치라 한다. 굳이 실행 시점이 아니더라도 컴파일 시점에 어느 메서드로 호출이 일어날 것을 결정 되는 것을 말한다. 그럼 다시 아래의 코드를 살펴보자.
    class A {
      private BB bb;
    
      A(BB bb) {
        this.bb = bb;
      }
    
      void print() {
        bb.print();
      }
    }
    
    class B implements BB {
      public void print() {
        System.out.println("B");
      }
    }
    class B1 implements BB {
      public void print() {
        System.out.println("B1");
      }
    }
    
    interface BB {
      void print();
    }
    
    위의 코드를 다이어그램으로 그리면 다음과 같다.
    A(클래스) - - - > BB (인터페이스) BB의 구현체들은 B와 B1이 존재 한다.
    A의 클래스는 BB라는 인터페이스를 의존하고 있다. 이렇게 된다면 굳이 B가 아니더라도 B1 혹은 BB를 구현한 구현체들이 올 수 있다. 이걸로 좀 더 A라는 클래스는 BB를 구현한 구현체에 변화에 영향을 받지 않고 지속적으로 재사용이 가능하다. 다시 A 클래스의 print() 메서드를 살펴보자. 거기에는 아까와 동일하게 bb.print()를 호출 하는 부분이 있다. 그렇다면 과연 bb.print()를 호출 할때 컴파일러가 B를 호출 할지 B1을 호출할지 결정이 되어 있을까? 그랬으면 좋겠지만 안타깝게 그렇지 않다. 안타까운건가? 물론 우리는 알고 있지만 컴파일러는 결정하지 못한다. 컴파일 시점에는 모르지만 런타임 시점에 BB에 할당된 object가 무엇인가를 보고 결정하게 되는 것이다. 우리는 이것을 다이나믹 디스패치라 부른다. 오늘은 간단하게 다이나믹 디스패치가 무엇인가를 살펴봤다. 다음시간에는 좀더 구체적인 예시를 들어 보며 더욱 확장성있게 만들 수 있는 더블디스페치에 대해서 정리해보자. 오늘은 짧게 이만!

    댓글

Designed by Tistory.