[F-Lab 챌린지 25일차] 재사용성과 다이나믹 디스패치, 더블 디스패치(토비님 강의)

성수데브리·2023년 7월 23일
0

f-lab_java

목록 보기
21/73

참고 : 재사용성과 다이나믹 디스패치, 더블 디스패치(토비님 강의)
https://www.youtube.com/watch?v=s-tXAHub6vg


Dependency

의존 관계

  • Supplier의 변화가 Client에 영향을 주는 경우

의존 관계 발생

  • Supplier 가 Client 의 필드
  • Supplier 가 Client 메서드의 파라미터
  • Supplier 가 Client 의 로컬 변수
  • Supplier 가 Client 로 메세지를 보냄

의존 관계 단점

  • Client 는 재사용이 어렵다.
  • Client 는 컴포넌트/서비스가 될 수 없다.

    컴포넌트란

    “컴포넌트란 이를 만든 개발자의 손이 미치지 않는 곳에서도, 아무 변경 없이, 필요에 따라 확장해서 사용될 수 있는 소프트웨어 덩이다.” - Martin Fowler-

오브젝트 패턴

오브젝트 패턴은 런타임시에 바뀔 수 있는, (상속 관계보다) 더 동적인 오브젝트 (의존) 관계를 다룬다.

  • GoF -

디자인 패턴 분류

  1. Class
  2. Object → 여기에 속하는 패턴드이 위의 인용문에 해당한다.
    즉, 이 패턴은 동적으로 의존 관계를 변경할 수 있는 설계를 제시한 것이다.
  • 컴파일 타임이 아니라 런타임시에 결정/구성되는 오브젝트 의존 관계
    1. 구현 대신 인터페이스 사용
      • 구현 클래스 의존 관계 제거
      • 클레스에 대한 의존성은 생성 패턴처럼 3자에게 위임
    2. 오브젝트 합성 사용
      • 재사용성을 확보하기 위한 방법의 한 가지(상속의 대안)
      • 인터페이스 사용이 전제(블랙 박스 재사용)
      • 새롭고 복잡한 기능을 얻기 위해서 오브젝트를 조합/합성
      • 런타임시에 다른 오브젝트에 대한 레퍼런스를 획득
      • 각 클래스가 캡슐화되고 자신의 역할에 충실하게 도와줌

Dynamic Method Dispatch

  1. static dispatch

    1. 컴파일 시점에 실행해야 할 메서드를 알고 있음
  2. dynamic dispatch

    public abstract class Service {
    	abstract void run();
    }
    
    public class extends Service1 {
    		void run(){
    			System.out.println("run1");
    		}
    }
    
    public class extends Service2 {
    		void run(){
    			System.out.println("run2");
    		}
    }
    
    // dynamic dispatch
    List<Service> services = List.of(new Service1(), new Service2());
    services.forEach(Service::run);
    • 다이나믹 디스패치는 런타임에 변수 svc 의 타입을 확인하고 Service1run() 을 호출하는 것이다.
    • 다이나믹 디스패치가 가능한 이유 : receiver parameter 실제 객체를 나타내는 this 가 메서드 안에 숨겨져 있다 ?
    • 메서드 오버로딩은 컴파일 타임에 결정되어야 한다.
    • 메서드 오버로딩은 컴파일 타임에 결정되어야 한다.

Double Dispatch : 다이나믹 디스패치를 2번 하는 경우

Visitor Pattern


출처 : https://en.wikipedia.org/wiki/Visitor_pattern

Visitor Proxy Pattern(Hibernate)


Polymorphism

Poly : many

morph : shapes

dynamic : after compilation (during runtime)
static : compile time

  • 다형성이란 서로 다른 타입에 속하는 객체들이 동일한 메세지를 수신할 경우 서로 다른 메서드를 이용해 메세지를 처리할 수 있는 메커니즘을 말한다.
  • 다형성 관계에 있는 객체들은 동일한 책임을 공유한다.
  • 협력을 재사용한다.
    [출처 :객체지향의 사실과 오해]

다형성은 시점에 따라 다르다.
1. 컴파일 타임에는 오버로딩 메서드
2. 런타임에는 오버라이딩 메서드


Method signature : name, parameter tyes, return type(리턴 타입도 포함된다고 잘 못 알고있는 경우 많음)

Method type : return type, method type parameter, method argument types, exception

❗메서드 타입이 일치해야 Method Reference 쓸 수 있다!!


컴파일 시점과 런타임 시점에 JVM 이 메서드 호출을 어떻게 다르게 하는지 매커니즘이 궁금해진다.

0개의 댓글