개발 일지/Java

[Java] List<E>

미숫가루설탕많이 2023. 1. 4. 16:01

 List 인터페이스는 배열과 같이 객체를 일렬로 늘어놓는 구조를 가지고 있으며 List 컬렉션 클래스는 다음과 같은 특징을 가진다.

 

  • 요소의 저장 순서 유지
  • 같은 요소의 중복 저장 허용

 

 객체를 인덱스로 관리하기 때문에 객체를 저장하면 자동으로 인덱스가 부여되고, 인덱스로 객체를 검색, 추가, 삭제할 수 있는 등의 여러 기능을 제공한다.

 

 List 인터페이스를 구현한 클래스는 ArrayList, Vector, LinkedList, Stack 등이 있다.

 

 

 

 

ArrayList


 ArrayList는 컬렉션 프레임워크에서 가장 많이 사용되는 컬렉션 클래스 중 하나이다. JDK 1.2부터 제공된 ArrayList 클래스는 내부적으로 배열을 이용하여 요소를 저장한다. 기능적으로는 Vector와 동일하지만 기존의 Vector를 개선한 것이므로 Vector 보다는 주로 ArrayList를 사용한다.

 

 ArrayList는 리스트 계열 자료구조의 특성을 이어받아 데이터가 연속적으로 존재한다. 즉, 데이터의 순서를 유지한다.

 

 배열을 이용하기 때문에 인덱스를 이용해 배열 요소에 빠르게 접근할 수 있지만, 배열은 생성될 때 크기가 고정되는 반면 ArrayList는 저장용량을 초과하여 객체가 추가되면 자동으로 저장용량이 늘어나게 된다. 따라서, 새로운 배열을 생성하고 기존의 요소들을 옮겨야 하는 복잡한 과정이 자동으로 수행되지만, 요소의 추가 및 삭제하는 작업에 걸리는 시간이 길어지는 단점이 있다.

 

 ArrayList를 생성하기 위해서는 저장할 객체 타입을 타입 매개변수, 즉 제네릭으로 표기하고 기본 생성자를 호출한다.

ArrayList<타입 매개변수> 객체명 = new ArrayList<타입 매개변수>(초기 저장용량);

ArrayList<String> container1 = new ArrayList<String>();
// String 타입의 객체를 저장하는 ArrayList 생성
// 초기 용량이 인자로 전달되지 않으면 기본적으로 10으로 지정됨

 

 ArrayList에 객체를 추가하면 인덱스 0부터 차례대로 저장된다. 그리고 특정 인덱스의 객체를 제거하면, 바로 뒤 인덱스부터 마지막 인덱스까지 모두 앞으로 1씩 당겨진다.

 

 

 

 

LinkedList


 LinkedList는 ArrayList 클래스가 배열을 이용하여 요소를 저장할 때 발생하는 단점을 극복하기 위해 고안되었으며, 데이터를 효율적으로 추가, 삭제, 변경하기 위해 사용한다.

 

 배열에는 모든 데이터가 연속적으로 존재하지만, LinkedList에는 불연속적으로 존재하며 이 데이터는 서로 연결되어 있다.

 

 LinkedList의 각 요소들은 자신과 연결된 이전 요소 및 다음 요소의 주소값과 데이터로 구성되어 있다. 만약 데이터를 삭제하려면, 삭제하고자 하는 요소의 이전 요소가 삭제하고자 하는 요소의 다음 요소를 참조하도록 변경하면 된다. 배열처럼 데이터를 이동하기 위해 복사할 필요가 없기 때문에 ArrayList보다 처리 속도가 훨씬 빠르다.

 

 데이터를 추가할 때도 마찬가지로, 이전 요소가 새로운 요소를 참조하고 새로운 요소가 다음 요소를 참조하게 만들면 된다.

 

 

 

 

ArrayList와 LinkedList


 우선 ArrayList에 객체를 순차적으로 저장할 때는 데이터를 이동하지 않아도 되므로 작업 속도가 빠르지만, 중간에 위치한 객체를 추가 및 삭제할 때는 데이터 이동이 많이 일어나므로 속도가 저하된다. 반면 인덱스가 n인 요소의 주소값을 얻기 위해서는 데이터에 빠르게 접근이 가능하기 때문에 검색(읽기) 측면에서는 유리하다.

 

 즉, ArrayList는 데이터를 순차적으로 추가하거나 삭제하는 경우, 데이터를 읽어들이는 경우에서 강점을 지닌다. 하지만 중간에 데이터를 추가하거나, 중간에 위치하는 데이터를 삭제하는 경우에서는 효율적이지 못하다.

 

 LinkedList는 이전 요소와 다음 요소에 저장되어 있는 주소값만 변경해주면 된다. 즉, ArrayList처럼 각 요소들을 뒤로 밀어내거나 앞으로 당기지 않아도 된다. 따라서 데이터를 중간에 추가하거나 삭제하는 경우에 ArrayList보다 빠른 속도를 보여준다.

 

 하지만 데이터를 검색할 때는 시작 인덱스부터 찾고자하는 데이터까지 순차적으로 노드에 접근해야 하기 때문에 ArrayList보다 상대적으로 속도가 느리다.

 

 따라서 LinkedList는 중간에 위치하는 데이터를 추가하거나 삭제하는 경우에서 강점을 지닌다.

 

 결론적으로 데이터의 잦은 변경이 예상된다면 LinkedList, 데이터의 개수가 변하지 않는다면 ArrayList를 사용하는 것이 좋다.

'개발 일지 > Java' 카테고리의 다른 글

[Java] Map<K, V>  (1) 2023.01.04
[Java] Set<E>  (0) 2023.01.04
[Java] 컬렉션 프레임워크(Collection Framework)  (0) 2023.01.04
[Java] 예외 처리(Exception Handling)  (0) 2023.01.04
[Java] 에러(Error)  (0) 2023.01.04