List - 리스트 추상화3 - 컴파일 타임, 런타임 의존관계

2024. 5. 22. 11:11김영한 Java/컬렉션 프레임워크

의존관계는 크게 컴파일 타임 의존관계와 런타임 의존관계로 나눌 수 있다.

  • 컴파일 타임 : 코드 컴파일 시점을 뜻한다.
  • 런타임 : 프로그램 실행 시점을 뜻한다.

컴파일 타임 의존관계 vs 런타임 의존관계

 

컴파일 타임 의존관계

  • 컴파일 타임 의존관계는 자바 컴파일러가 보는 의존관계이다. 클래스에 모든 의존관계가 다 나타난다.
  • 쉽게 이야기해서 클레스에 바로 보이는 의존관계이다. 그리고 실행하지 않은 소스 코드에 정적으로 나타나는 의존관계이다.
  • BatchProcessor 클래스를 보면 MyList 인터페이스만 사용한다. 코드 어디에도 MyArrayList나 MyLinkedList같은 정보는 보이지 않는다. 따라서 BatchProcessor는 MyList에만 의존한다.

 

런타임 의존관계

MyArrayList
MyLinkedList

 

 

정리

  • MyList 인터페이스의 도입으로 같은 리스트 자료구조를 그대로 사용하면서 원하는 구현을 변경할 수 있게 되었다.
  • BatchProcessor에서 다음과 같이 처음부터 MyArrayList를 사용하도록 컴파일 타임 의존관계를 지정했다면 이후에 MyLinkedList로 수정하기 위해서는 BatchProcessor의 코드를 변경해야 한다.
public class BatchProcessor{
	private final MyArrayList<Integer> list = new MyArrayList(); //코드 변경 필요
}
  • BatchProcessor 클래스는 구체적인 MyArrayList나 MyLinkedList에 의존하는 것이 아니라 추상적인 MyList에 의존한다. 따라서 런타임에 MyList의 구현체를 얼마든지 선택할 수 있다.
  • BatchProcessor에서 사용하는 리스트의 의존관계를 클래스에서 미리 결정하는 것이 아니라, 런타임에 객체를 생성하는 시점으로 미룬다. 따라서 런타임에 MyList의 구현체를 변경해도 BatchProcessor의 코드는 전혀 변경하지 않아도 된다.
  • 이렇게 생성자를 통해 런타임 의존관계를 주입하는 것을 생성자 의존관계 주입 또는 줄여서 생성자 주입이라 한다.
  • 클라이언트 클래스는 컴파일 타임에 추상적인 것에 의존하고, 런타임에 의존 관계 주입을 통해 구현체를 주입받아 사용함으로써, 이런 이점을 얻을 수 있다.