우선, 글을 작성하기 전 이 글의 모든 내용은 김영한님의 JAVA 강의를 바탕으로 함을 알립니다.
앞 포스트에서 ArrayList와 LinkedList를 살펴보았다. 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를 인터페이스로 추상화하여 ArrayList, LinkedList를 구현체로 구현하면 다형성을 통해 유지보수 측면에서 많은 성능 향상을 구현할 수 있다.
ArrayList 자료구조를 통해 많은 데이터 유입을 처리하는 BatchProcessor라는 프로그램이 있다고 가정하자.
public class BatchProcessor {
private final MyArrayList<Integer> list = new MyArrayList<>();
/**
* 처리 로직
**/
}
이때 앞부분에서의 데이터 유입측면에서는 LinkedList가 ArrayList보다 성능이 높아 데이터 저장공간을 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타입의 참조형 객체를 직접 외부에서 받아오는 것을 확인 할 수 있다. 다형성에 의해 생성자로 유입되는 list로 List의 구현체는 모두 가능하다. BatchProcessor내부에서 상황에 따라 코드의 수정 없이 ArrayList 또는 LinkedList를 외부의 유입을 통해 사용이 가능한 것이다.List와 생성자를 통해 클래스(BatchProcessor)외부에서 의존할 대상이 결정되어서 다형성에 의해 내부로 유입되는 것을 DI(Dependency Injection), 의존성 주입이라고 한다다시 정리 해보자.

클라이언트인 BatchProcessor가 List 인터페이스에만 의존 한다
ArrayList 또는 LinkedList 참조값이 클라이언트인 BatchProcessor에 전달됨OCP 원칙에 의해 클라이언트 코드 변경없이 다형적 참조에 의해 구현체를 성능에 맞게 사용하여 필요한 기능을 사용할 수 있게 된다의존성 주입을 통해 객체간의 의존을 클래스 외부에서 구현하여 클라이언트 코드의 변경없이 구현이 가능하다