Java에서 배열 List를 만드는 방법엔 List를 통해서 만드는 방법과 ArrayList를 통해서 만드는 방법이 있습니다.
List<Integer> list = new ArrayList<Integer>();
ArrayList<Integer> list = new ArrayList<Integer>();
그럼 이 두 가지 방법의 차이는 무엇일까요?
List는 인터페이스입니다.
즉, Java의 다형성에 의해서 만약 아래와 같이 list를 List 자료형으로 선언한 경우, 그 구현체를 ArrayList로도 구현할 수 있지만 LinkedList로 구현 할수도 있습니다.
List<Integer> list = new ArrayList<Integer>();
list = new LinkedList<Integer>(); // 요구사항 변경 등의 이유로 구현체가 바뀌어도 호환 가능
참고 Interface란?
클래스는 크게 일반 클래스와 클래스 자체에 abstract가 붙거나 클래스 내에 '추상 메서드'가 하나 이상 존재하는 추상 클래스로 나뉩니다.
인터페이스는 클래스 내에 선언된 모든 메서드가 추상 메서드인 클래스를 의미합니다.
이 인터페이스를 상속받는 클래스는 인터페이스에서 정의된 추상 메서드를 모두 구현해야 합니다.
ArrayList는 클래스입니다. ArrayList 역시 아래처럼 List 인터페이스를 구현하고 있기 때문에 List가 제공하는 기능들을 다 제공할 수 있으므로 List 선언 시 구현 인스턴스의 자료형으로 작성할 수 있습니다. 하지만, List와 다르게 ArrayList의 자료형으로 생성한 경우 LinkedList로 새롭게 구현체를 만들거나 형변환을 할 수는 없습니다.
ArrayList<Integer> list = new ArrayList<Integer>();
list = new LinkedList<Integer>(); // error 발생
List는 인터페이스이고 ArrayList는 이 List를 구현한 클래스입니다. 그러므로 List로 선언을 한 경우 인스턴스를 ArrayList로 받을 수 있고 LinkedList로 받을 수 있습니다. ArrayList, LinkedList 둘 다 List 인터페이스를 구현했기 때문이죠.
하지만 ArrayList로 선언한 경우는 ArrayList의 인스턴스를 만들어야 하므로 ArrayList로 받아야합니다. LinkedList로는 ArrayList를 인스턴스를 만들 수 없기 때문입니다.