자료구조에서 다형성과 OCP 원칙을 잘 활용할 수 있다.
순서가 있고, 중복을 허용하는 자료 구조를 List라 한다.
ArrayList와 LinkedList의 공통 기능을 인터페이스로 뽑아서 추상화하면 다형성을 활용한 다양한 이득을 얻을 수 있다.

public class Processor {
private final MyList<Integer> list;
public Processor(MyList<integer> list) {
this.list = list;
}
public void logic(int size) {
for (int i = 0; i < size; i++) {
list.add(0, i);
}
}
}
main() {
new Processor(new MyArrayList()); //ArrayList 사용하고 싶을 때 사용
new Processor(new MyLinkedList()); // LinkedList 사용하고 싶을 때 사용
}
Processor 가 MyArrayList() , MyLinkedList() 에 직접 의존하는게 아니라 MyList() 인터페이스에 의존해 원하는 클래스를 원할 떄 꺼내서 사용하면 된다.
이렇게 인터페이스에 의존하면 Processor 의 코드를 전혀 변경하지 않고, 원하는 리스트 전략을 런타임에 지정할 수 있다.
public Processor(MyList<integer> list) {
this.list = list;
}
Processor 생성자를 통해 런타임 의존관계를 주입하는 것을 생성자 주입이라 한다.Collection 인터페이스는 java.util 패키지의 컬렉션 프레임워크의 핵심 인터페이스 중 하나이다.
List, Set, Queue 와 같은 다양한 하위 인터페이스와 함꼐 사용되며, 데이터를 각 형태에 맞게 관리할 수 있다.
List 인터페이스는 java.util 패키지에 있는 컬렉션 프레임워크의 일부이다.
Collection 인터페이스에게 상속받는다.
객체들의 순서가 있는 컬렉션을 나타내며, 같은 객체의 중복 저장을 허용한다.
배열과 비슷하지만, 크기가 동적으로 변화하는 컬렉션을 다룰 때 유연하게 사용가능 하다.
List 실제 성능
이론적으로 LinkedList 의 중간 삽입 연산은 ArrayList 보다 빠르다.
그러나 실제 성능은 데이터 순차적 접근 속도, 메모리 할당 및 해제 비용, CPU 캐시 활용도 등 다양한 요소에 영향을 받는다.
또한 자바의 ArrayList 는 데이터를 한 칸씩 이동시키지 않고, 메모리 고속 복사 연산을 사용한다.
따라서 여러가지 요소에 의해 ArrayList 가 실제 사용 환경에서 더 나은 성능을 보여주는 경우가 많다.
실무에서는 주로 ArrayList 를 사용한다.
만약 많은 데이터를 반복적으로 추가 / 삭제 하는 일이 많을 때만 LinkedList 를 고려한다.