Array List는 배열(Array)처럼 자료를 연속적으로 담고 같이 제어할 수 있는 자료구조이다. 배열의 단점을 극복하기 위해 사용한다. 단점은 배열보다 어렵다...
더 자세히 알아보자.
import java.util.ArrayList;아래는 배열과 ArrayList의 차이를 나타내는 표다
| 배열 | ArrayList | |
|---|---|---|
| 작성법 | int[] a = new int[3] | ArrayList<> a = new ArrayList<>() |
| 크기 | 한 번 설정한 크기는 변경할 수 없다. (정적할당) | 크기를 자유롭게 변경할 수 있다. (동적할당) |
| 속도 | 메모리에 연속적으로 저장이 되어있어, 빠르게 접근 가능 | 주소로 연결되어 있어 접근이 배열보다 느리다. |
| 빈공간 | 값을 할당하지 않거나, 중간의 요소를 삭제하면 빈공간으로 남는다. | 빈공간을 허용하지 않아 삽입, 삭제 시 데이터들이 자동으로 이동 |
| 요소 | 같은 타입만 저장 | 다양한 타입의 데이터 함께 저장 가능 |
// 1. ArrayList 객체 생성 기본 방법
// 변수a에 ArrayList 리모콘 저장
ArrayList<> a = new ArrayList<>();
// 2. ArrayList 객체 생성 타입 설정
// 변수a에 String타입만 저장할 수 있는 ArrayList 리모콘 저장
ArrayList<String> a = new ArrayList<>();
// 3. ArrayList 객체 생성 초기 용량(capacity) 지정
// 변수a에 String타입만 10개 저장할 수 있는 ArrayList 리모콘 저장
ArrayList<String> a = new ArrayList<>(10);
3가지 방식으로 ArrayList를 생성했다.
ArrayList는 초기용량을 지정할 수도 있고, 꺽쇠<>안에 ArrayList의 타입을 지정할 수 도 있다. 저 꺽쇠는 바로 제네릭이다.
클래스 내부에서 지정하는 것이 아닌 외부에서 사용자에 의해 타입을 지정할 수 있는 키워드다.
위의 코드처럼 ArrayList는 저장할 수 있는 타입이 정해져 있지 않다. ArrayList에 저장할 데이터 타입을 사용자가 클래스 외부에서 제네릭을 통해 지정할 수 있다.
제네릭을 사용하면 타입의 경계를 지정하고 다른 타입이 유입되는 상황을 막을 수 있다. 또, 제네릭을 사용해 미리 타입을 지정하면 컴파일 단계에서 데이터 타입을 미리 체크하기 때문에 캐스팅할 필요가 없어진다.
ArrayList를 생성하고 요소를 추가 할 수 있다. 이 때 ArrayList가 제네릭으로 타입을 명시했다면 명시된 타입의 요소만 추가 가능하다. 또 ArrayList는 빈 공간을 허용하지 않기 때문에 삽입 시 ArrayList의 사이즈보다 큰 인덱스에 빈공간을 건너뛰기하여 추가하는 것은 불가능하다.
가장 기본적인 요소 추가 메서드
ArrayList<String> list = new ArrayList<>();
list.add("A");
list.add("B");
맨 뒤에 요소가 추가된다.
인덱스를 지정해서 추가할 수도 있다.
list.add(1, "C");
해당 위치에 삽입되고, 기존 요소들은 뒤로 밀린다.
다른 컬렉션의 모든 요소를 한 번에 추가
ArrayList<String> list1 = new ArrayList<>();
list1.add("A");
list1.add("B");
ArrayList<String> list2 = new ArrayList<>();
list2.add("C");
list2.add("D");
list1.addAll(list2);
지정한 위치에 삽입
list1.addAll(1, list2);
중간 위치에 삽입하면 뒤의 요소들이 한 칸씩 뒤로 이동한다.
list.add(0, "Z");
인덱스로 삭제
list.remove(0);
객체로 삭제
list.remove("A");
처음 발견된 해당 객체 하나만 삭제된다.
지정한 컬렉션에 포함된 요소들을 모두 삭제
list.removeAll(list2);
모든 요소 삭제.
size는 0이 되지만 capacity는 줄어들지 않는다.
list.clear();
인덱스로 요소 접근
String value = list.get(0);
리스트의 일부 구간을 잘라서 새로운 리스트처럼 사용
List<String> sub = list.subList(1, 3);
시작 인덱스 포함, 끝 인덱스 미포함
특정 위치의 요소를 다른 값으로 변경
list.set(0, "X");
참고 자료