본문 바로가기
자료구조

Arraylist

by 앙헬디마리아 2021. 2. 7.
728x90

컬렉션프레임워크의 첫번째 List !!

List의 특징은 순서를 유지하고 저장하며, 중복 저장이 가능하다.

 

 

array (배열)

 

1. 배열 선언시 배열의 크기를 지정 해야함.

2. 지정된 크기 이상으로 할당 안됨.

 

1. 사이즈 10인 배열 -> 사이즈 5로 줄이기

 

- 불가능하다. 이러한 이유로 다른 자료구조들이 있다.

- 배열은 선언할때 사이즈를 지정해줘야함.

- Arrays.asList(배열) 리스트 변환 후 사이즈 변경

- Arrays.CopyOf 를 통한 사이즈 변경

2. 사이즈 변경이 가능한 자료구조

 

- ArrayList는 배열을 이용해서 리스트를 구현한 것을 의미한다.

- ArrayList 내부구조를 보면 배열의 크기가 부족할 경우 grow 라는 메서드가 배열의 크기를 증가시켜줌.

- ArrayList는 Thread Safe 하지 않아서 Vector를 사용하여 스레드 처리를한다( 물론 이제 Vector는 잘안씀)

리스트를 활용해서 스레드 세이프를 하기 위해서는 Sysncronized 하게 만들어주는 메소드를 사용해야 함.

3. 가변 자료구조

추가/삭제

인덱스 조회

ArrayList

느림

빠름

LinkedList

빠름

느림

ArrayList는 List 인터페이스의 구현 클래스로 ArrayList에 객체를 추가하면 객체가 인덱스로 관리된다.

 

일반 배열과 ArrayList는 인덱스로 객체를 관리한다는 점에서는 유사하지만, 큰 차이점을 가지고 있다.

 

배열은 생성할 때 크기가 고정되고 사용 중에 크기를 변경할 수 없지만, ArrayList는 저장 용량을 초과한 객체들이 들어오면 자동적으로 저장 용량이 늘어난다.

 

예를들어 String을 저장하는 ArrayList는 다음과 같이 생성할 수 있다.

 

List<String> list = new ArrayList<>();

//기본 생성자로 ArrayList 객체를 생성하면 내부에 10개의 객체를 저장할 수 있는 초기 용량을 가짐.
//저장되는 객체 수가 늘어나면 용량이 자동으로 증가하지만, 처음부터 용량을 크게 잡고 싶다면

List<String> list = new ArrayList<>(30);

//처럼 매개값으로 받는 생성자를 이용하면된다.

 

ArrayList에 객체를 추가하면 인덱스 0부터 차례대로 저장된다. ArrayList에서 특정 인덱스의 객체를 제거하면 바로 뒤 인덱스부터 마지막 인덱스까지 모두 앞으로 1씩 당겨진다. 마찬가지로 특정 인덱스에 객체를 삽입하면 해당 인덱스부터 마지막 인덱스 까지 모두 1씩밀려난다.

 

다음은 4번 인덱스가 제거되었을때 5번 인덱스부터 모두 앞으로 1씩 당겨지는 모습을 보여준다.

 

 

따라서 빈번한 객체 삭제와 삽입이 일어나는 곳에서는 ArrayList를 사용하는 것이 바람직하지 않다.

 

이런 경우라면 LinkedList를 사용하는 것이 좋다. 그러나 인덱스 검색이나, 맨 마지막에 객체를 추가하는 경우에는 ArrayList가 더 좋은 성능을 발위한다.

728x90

'자료구조' 카테고리의 다른 글

HashSet  (0) 2021.03.01
LinkedList  (0) 2021.02.07