[자료구조] List와 의존 관계 주입

나의 개발 일지·2025년 1월 6일

자료구조

목록 보기
3/7

우선, 글을 작성하기 전 이 글의 모든 내용은 김영한님의 JAVA 강의를 바탕으로 함을 알립니다.

💡List

앞 포스트에서 ArrayListLinkedList를 살펴보았다. java에서 제공하는 두 클래스는 List인터페이스의 구현체로 List인터페이스의 핵심 메서드만 살펴보면 다음과 같다

public interface MyList<E> {

    int size();

    void add(E e);

    void add(int index, E e);

    E get(int index);

    E set(int index, E element);

    E remove(int index);

    int indexOf(E o);
}

List 추상화

  • List는 순서가 있고 중복을 허용하는 자료구조

  • 리스트 추상화

    • List를 인터페이스로 추상화하여 ArrayList, LinkedList를 구현체로 구현하면 다형성을 통해 유지보수 측면에서 많은 성능 향상을 구현할 수 있다.

의존 관계 주입(Dependency Injection)

ArrayList 자료구조를 통해 많은 데이터 유입을 처리하는 BatchProcessor라는 프로그램이 있다고 가정하자.

public class BatchProcessor {
	private final MyArrayList<Integer> list = new MyArrayList<>();
    
   /**
   * 처리 로직
   **/
}
  • 이때 앞부분에서의 데이터 유입측면에서는 LinkedListArrayList보다 성능이 높아 데이터 저장공간을 LinkedList로 변환하려고 한다. 즉, BatchProcessor의 직접적인 코드 수정이 필요하다. 이런 경우를 클라이언트 코드인 BatchProcessor구체적인 클래스에 의존한다고 표현한다.

  • BatchProcessor가 추상적인 List에 의존하면 어떻게 될까?

public class BatchProcessor {

//    private final MyArrayList<Integer> list = new MyArrayList<>();
    private final MyList<Integer> list;

    public BatchProcessor(MyList<Integer> list) {
        this.list = list;
    }
    
    /**
    * 처리 로직
    **/
}
  • 수정된 BatchProcessor를 보면 생성자를 통해 List타입의 참조형 객체를 직접 외부에서 받아오는 것을 확인 할 수 있다. 다형성에 의해 생성자로 유입되는 listList의 구현체는 모두 가능하다.
  • 즉, BatchProcessor내부에서 상황에 따라 코드의 수정 없이 ArrayList 또는 LinkedList를 외부의 유입을 통해 사용이 가능한 것이다.
  • 위와 같이 추상적인 List와 생성자를 통해 클래스(BatchProcessor)외부에서 의존할 대상이 결정되어서 다형성에 의해 내부로 유입되는 것을 DI(Dependency Injection), 의존성 주입이라고 한다

다시 정리 해보자.

◻️ 컴파일 타임 의존관계

  • 런타임 이전 컴파일 시점에는 클라이언트BatchProcessorList 인터페이스에만 의존 한다

◻️ 런타임 의존관계

  • 코드가 실행되어 런타임 시점에는 생성자를 통해 ArrayList 또는 LinkedList 참조값이 클라이언트인 BatchProcessor에 전달됨
  • 즉, 클라이언트는 의존 관계를 클래스내에서 결정하지 않고 런타임의 객체 생성 시점에 결정한다. OCP 원칙에 의해 클라이언트 코드 변경없이 다형적 참조에 의해 구현체를 성능에 맞게 사용하여 필요한 기능을 사용할 수 있게 된다

정리

  1. 의존관계를 클래스 내부에서 직접 의존하면 상황에 따라 클라이언트 코드를 매번 변경하는 일이 발생한다
  2. 의존성 주입을 통해 객체간의 의존을 클래스 외부에서 구현하여 클라이언트 코드의 변경없이 구현이 가능하다

0개의 댓글