Java

Java26. List 컬렉션 리스트의 특징 (ArrayList, Vector, LinkeList)

지댕댕 2023. 3. 28. 22:32
728x90

List 컬렉션은 배열과 비슷하게 객체를 인덱스로 관리.

배열과의 차이점은 저장 용량이 자동으로 증가, 객체를 저장할 때 자동 인덱스가 부여됨. 추가, 삭제, 검색을 위한 다양한 메서드들이 제공됨.

List 컬렉션은 객체 자체를 저장하는 것이 아니라 객체의 번지를 참조함. 그렇기 때문에 동일한 객체를 중복 저장할 수 있고, 이 경우 동일한 번지가 참조됨 null도 저장이 가능하고 해당 인덱스는 객체를 참조하지 않음.

List 컬렉션에 객체를 추가할 때에는 add() 메서드를 사용, 객체를 찾아올 때에는 get() 메서드를 사용, 객체 삭제는 remove() 메서드를 사용하고 List 컬렉션에 저장된 모든 객체를 대상으로 하나씩 가져와 처리하고 싶다면 인덱스를 이용하는 방법과 향상된 for 문을 이용하는 방법이 있음. 인덱스를 이용하는 방법은 List컬렉션에 size() 메서드는 현재 저장되어 있는 객체 수를 리턴.

ArrayList

Array List는 List 인터페이스의 대표적인 구현 클래스이다. 컬렉션 프레임웍에서 가장 많이 사용되는 컬렉션 클래스이다. ArrayList는 List 인터페이스를 구현하기 때문에 데이터의 저장순서가 유지되고 중복을 허용한다는 특징을 가지고 있음! ArrayList는 기존의 Vector를 개선한 것으로 Vector와 구현원리와 기능적인 측면에서 동일하다고 할 수 있다. Vector는 기존에 작성된 소스와의 호환성을 위해서 계속 남겨 두고 있을 뿐이기 때문에 가능하면 Vector보다는 ArrayList를 사용. ArrayList는 Object배열을 이용해서 데이터를 순차적으로 저장한다. 예를 들어서 첫 번째로 저장한 객체는 Object배열의 0번째 위치에 저장되고 그다음에 저장하는 객체는 1번째 위치에 저장된다. 이런 식으로 계속 배열에 순서대로 저작며, 배열에 더 이상 저장할 공간이 없으면 보다 큰 새로운 배열을 생성해서 기존의 배열에 저장된 내용을 새로운 배열로 복사한 다음에 저장된다.

ArrayList 객체를 생성하면 내부에 10개의 객체를 저장할 수 있는 초기 용량을 가지게됨, 저장되는 객체 수가 늘어나면 용량이 자동으로 증가, ArrayList에 객체를 추가하면 0번 인덱스부터 차례데로 저장되고, 특정 인덱스의 객체를 제거하면 바로 뒤 인덱스부터 마지막 인덱스까지 모두 앞으로 1씩 당겨짐. 특정 인덱스에 객체를 삽입하면 해당 인덱스부터 마지막 인덱스까지 모두 1씩 밀려남 (객체의 삭제와 생성이 자주 필요할 곳에서는 ArrayList를 사용하는 것이 부적합)

ArrayList를 생성할 때, 저장할 요소의 개수를 고려해서 실제 저장할 개수보다 약간 여유 있는 크기로 하는 것이 좋다. 생성할 때 지정한 크기보다 더 많은 객체를 저장하면 자동적으로 크기가 늘어나기는 하지만 이 과정에서 처리시간이 많이 소요되기 때문!

LinkeList

LinkeList는 가장 기본적인 형태의 자료구조로 구조가 간단하며 사용하기 쉽고 데이터를 읽어 오는 데 걸리는 시간이 가장 빠르다 List 구현 클래스이므로 ArrayList와 사용 방법은 똑같고 내부 구조는 완전히 다르다. ArrayList는 내부 배열에 객체를 저장해서 관리하고 LinkeList는 인접 참조를 링크해서 체인처럼 관리함. LinkeList에서 특정 인덱스의 객체를 제거하면 앞뒤 링크만 변경되고 나머지 링크는 변경되지 않음. 특정 인덱스에 객체를 삽입할 때에도 같음!

단점.. 1.크기를 변경할 수 없다. 크기를 변경할 수 없으므로 새로운 배열을 생성해서 데이터를 복사해야 하고, 2. 실행속도를 향상하기 위해서는 충분히 큰 크기의 배열을 생성해야 하므로 메모리가 낭비된다. 3. 비순차적인 데이터의 추가 또는 삭제에 시간이 많이 걸린다. 4. 차례대로 데이터를 추가하고 마지막에서부터 데이터를 삭제하는 것은 빠르지만, 배열의 중간에 데이처를 추가하려면 빈자리를 만들기 위해 다른 데이터들을 복사해서 이동해야 한다.

하지만 이런 배열의 단점을 보완하기 위해서 링크드 리스트라는 자료구조가 고안되었고, 배열은 모든 데이터기ㅏ 연속적으로 존재하지만 링크드 리스트는 불연속적으로 존재하는 데이터를 서로 연결(link) 한 형태로 구성되어 있다.

(ArrayList는 중간 인덱스의 객체를 제거하면 뒤에 있는 객체의 인덱스가 1씩 앞으로 당겨지기 때문에 빈번한 객체 삭제와 삽입이 일어나는 곳에서는 ArrayList보다 LinkeList가 좋은 성능을 발휘)

Vector (클래스를 생성해줘야됨)

Vector는 ArrayList와 동일한 내부 구조를 가지고 있고 Vector를 생성하기 위해서는 저장할 객체 타입을 타입 파라미터로 표기하고 기본 생성자를 호출함.

ArrayList와 다른 점은 Vector는 동기화된 메서드로 구성되어 있기 때문에 멀티 스레드가 동시에 Vector의 메서드들을 실행할 수 없고, 하나의 스레드가 메서드를 실행을 완료해야만 다른 스레드가 메소드를 실행할 수 있음. 그래서 멀티 스레드 환경에서 안전하게 객체를 추가 삭제할 수 있고 이것을 스레드에 안전하다고 표현함.

 

728x90