Language/Java
[Java] List<E> 인터페이스
강서월
2023. 5. 15. 21:44
List<E> 인터페이스
- 배열과 같이 객체를 일렬로 늘어놓은 구조를 가지고 있다.
- 객체를 저장하면 자동으로 인덱스가 부여되고, 인덱스로 객체를 검색, 추가, 삭제할 수 있는 등의 여러 기능을 제공한다.
- List 인터페이스를 구현한 클래스에는 LinkedList, ArrayList, Stack, Vector 등이 있다.
List 인터페이스 메소드
Collection 인터페이스의 메소드 또한 상속받아서 사용이 가능하다.
ArrayList
ArrayList<타입 매개변수> 객체명 = new ArrayList<타입 매개변수>(초기 저장 용량);
//초기 용량이 인자로 전달되지 않으면 기본적으로 10으로 지정된다.
기능적으로 Vector와 동일하고 이를 개선한 것이다. 리스트 계열 자료구조의 특성을 이어받아 데이터가 연속적으로 존재한다.(데이터의 순서 유지)
배열과 공통점은 객체를 추가하면 객체가 인덱스로 관리된다. 차이점은 배열의 크기는 고정이며, ArrayList는 자동으로 저장용량이 늘어난다.
객체를 추가하면, 인덱스 0부터 차례대로 저장되고 특정 인덱스의 객체를 제거하면 바로 뒤 인덱스부터 마지막 인덱스까지 앞으로 1씩 당겨진다. 이러한 특성으로 객체 삭제와 삽입이 빈번이 일어나는 곳에서는 LinkedList보다 ArrayList를 사용한다.
LinkedList
LinkedList<String> list = new LinkedList<>();
각 요소(node)들은 자신과 연결된 이전 요소 및 다음 요소의 주소값과 데이터로 구성되어 있다.
배열처럼 데이터를 이동하기 위해서 복사할 필요가 없어 처리속도가 훨씬 빠르다. 그러나 배열은 모든 데이터가 연속적으로 존재하지만, linkedList는 불연속적으로 존재하며 데이터는 서로 연결(link) 되어 있다.
데이터 삭제할 때는 삭제 요소의 이전 요소가 삭제 요소의 다음 요소를 참조하도록 변경하고, 링크를 끊어주면 되고, 추가할 때는 새로운 요소를 추가하고자 하는 위치의 이전 요소가 새로운 요소를 참조하고 새로운 요소가 다음 요소를 참조하면 된다.
ArrayList와 LinkedList의 차이
데이터의 잦은 변경이 예상된다면 LinkedList, 데이터의 개수가 변하지 않는다면 ArrayList
ArrayList
- 데이터를 순차적으로 삭제하거나 추가하는 경우 데이터를 이동하지 않아도 되어 빠르다.
- 데이터를 읽어들이는 경우 (배열의 주소 + n*데이터 타입의 크기)를 계산한 인덱스를 통해 바로 접근할 수 있어 빠르다.
- 중간에 데이터를 추가하거나, 중간에 위치하는 데이터를 삭제하는 경우 데이터를 이동해야 해서 효율적이지 못하다.
LinkedList
- 데이터를 중간에 추가하거나 삭제하는 경우 빠르다.
- 데이터를 검색할 때에는 시작 인덱스부터 찾고자하는 데이터까지 순차적으로 각 노드에 접근해야 하기 때문에 속도가 느리다.