본문 바로가기

언어공부/Java

자바 List인터페이스, ArrayList, LinkedList

자바 List인터페이스, ArrayList, LinkedList에 대해서 알아보자

List인터페이스

List인터페이스는 순서가 있는 데이터의 집합으로 데이터의 중복을 허용한다. (예를 들어 대기자 명단.)

구현클래스들은 Vector, Stack, ArrayList, LinkedList가 있다.

 

직사각형은 인터페이스, 원형은 클래스를 나타낸다.

 


ArrayList

ArrayList는 컬렉션 프레임워크에서 가장 많이 사용되는 컬렉션 클래스이다. 이 ArrayList는 List인터페이스를 구현하기 때문에 데이터의 저장순서가 유지되고 중복을 허용한다.

 

ArrayList는 기존의 Vector를 개선한 것으로 Vector와 구현원리, 기능적인 측면에서 동일하다고 할 수 있다. Vector는 기존에 작성된 소스와의 호환성을 위해서 계속 남겨두고 있을 뿐이기 대문에 가능하면 ArrayList를 사용하는 것이 좋다. 

 

ArrayList는 Object배열을 이용해서 데이터를 순차적으로 저장한다. 선언된 배열의 타입이 모든 객체의 최고조상인 Object이기 때문에 모든 종류의 객체를 담을 수 있다.

 

ArrayList의 추가와 삭제

 

ArrayList의 요소를 삭제하는 경우, 삭제할 객체의 바로 아래에 있는 데이터를 한 칸씩 위로 복사해서 삭제할 객체를 덮어쓰는 방식으로 처리한다. 만일 삭제할 객체가 마지막 데이터이면, 복사할 필요 없이 단순히 null로 변경해주면 된다. ArrayList에 새로운 요소를 추가할 때도 먼저 추가할 위치 이후의 요소들을 모두 한칸씩 이동시킨 후에 저장해야한다.

 

배열에 객체를 순차적으로 저장할 때와 객체를 마지막에 저장된 것부터 삭제하면 데이터를 옮기지 않아도 되기 때문에 작업시간이 짧지만, 배열의 중간에 위치한 객체를 추가하거나 삭제하는 경우 다른 데이터의 위치를 이동시켜 줘야하기 때문에 다루는 데이터의 개수가 많을수록 작덥시간이 오래 걸린다.

 

ex)

 

List 인터페이스의 타입의 list참조변수에 ArrayList()객체주소를 대입(업캐스팅)한다. List를 사용하려면 java.util.List를, ArrayList를 사용하려면 java.util.ArrayList를 import해줘야한다. 

 

출력화면.

 


LinkedList

배열은 가장 기본적인 형태의 자료구조로 구조가 간단하며 사용하기 쉽고 데이터를 읽어 오는데 걸리는 시간(접근시간)이 가장 빠르다는 장점을 가지고 있지만 크기를 변경할 수 없고, 비순차적인 데이터의 추가 또는 삭제시간이 많이 걸린다는 단점이 있다.

 

이러한 배열의 단점을 보완하기 위해서 LinkedList라는 자료구조가 고안되었다. 배열의 모든 데이터가 연속적으로 존재하지만 LinkedList는 불연속적으로 존재하는 데이터를 서로 연결한 형태로 구성되어 있다. LinkedList의 각 요소(node)들은 자신과 연결된 다음 요소에 대한 참조(주소값)와 데이터로 구성되어 있다.

 

LinkedList의 추가와 삭제

LinkedList에서의 데이터의 삭제는 삭제하고자 하는 요소의 이전요소가 삭제하고자 하는 요소의 다음 요소를 참조하도록 변경하기만 하면 된다. 단 하나의 참조만 변경하면 삭제가 이루어지는 것이다.

 

추가할 때는 새로운 요소를 생성한 다음 추가하고자 하는 위치의 이전 요소의 참조를 새로운요소에 대한 참조로 변경해주고, 새로운 요소가 그 다음 요소를 참조하도록 변경하기만 하면 된다.

 

배열처럼 데이터를 이동하기 위해 복사하는 과정이 없기때문에 처리속도가 매우 빠르다.

 


ArrayList와 LinkedList의 비교

 

컬렉션 읽기(접근시간) 추가/삭제 비 고
 ArrayList 빠르다 느리다 순차적인 추가삭제는 더 빠름.
비효율적인 메모리사용.
LinkedList 느리다 빠르다 데이터가 많을수록 접근성이 떨어짐.

 

다루고자 하는 데이터의 개수가 변하지 않는 경우라면, ArrayList가 좋고, 데이터 개수의 변경이 잦다면 LinkedList를 사용하는 것이 좋다.