[Java] 자바 ArrayList 정리
★ ArrayList
ArrayList 는 List 인터페이스를 상속받은 클래스로 순서가 있는 데이터들의 집합입니다.
Array 는 컴파일 전에 반드시 배열의 크기를 지정해야 하며 그 크기가 고정되어 있어 늘리거나 줄일 수 없습니다.
ArrayList 는 Array 와 마찬가지로 인덱스로 내부 객체를 관리한다는 점에서 동일하지만, Array 와 달리 그 크기를 동적으로 늘릴 수 있으며 더 다양한 메소드를 제공합니다.
ArrayList 는 초기 용량을 10으로 지정하고, 초기에 지정한 용량을 넘어설 경우 그 크기의 1.5 배로 증가시킵니다.
★ ArrayList 선언
ArrayList 를 선언하는 방법은 다음과 같습니다.
타입을 지정하지 않고 선언할 경우에는 객체 내부에 데이터를 삽입할 때 임의의 자료형을 가진 데이터를 삽입하는 것이 가능하지만, 값을 뽑아내어 사용할 때는 캐스팅(Casting) 연산이 필요하기 때문에 권장하는 방식은 아닙니다.
ArrayList 는 저장 데이터 타입으로 object 만 허용하므로, 타입을 지정할 때는 기본형으로 지정할 수 없습니다.
예를 들어 기본형인 int 형으로 타입을 지정하고 싶다면 int 를 객체화 시킨 wrapper 클래스인 Integer 클래스를 사용하여 타입을 지정해야 합니다.
// 타입 지정 X
ArrayList list = new ArrayList();
// Integer 타입으로 지정
ArrayList<Integer> num1 = new ArrayList<>();
ArrayList<Integer> num2 = new ArrayList<Integer>();
// 초기 용량 intialCapacity 10으로 지정
ArrayList<Integer> num3 = new ArrayList<>(10);
// Integer 타입으로 지정 및 초기화
ArrayList<Integer> num4 = new ArrayList<Integer>(Arrays.asList(1, 2, 3));
★ ArrayList 데이터 삽입
ArrayList 에 데이터를 삽입하는 방법은 다음과 같습니다.
데이터를 추가할 위치인 인덱스를 생략하면 데이터는 ArrayList 의 맨 뒤에 삽입됩니다.
인덱스를 지정하여 삽입하게 되면 해당 인덱스부터 마지막 인덱스까지 모두 뒤로 1칸씩 밀려나게 됩니다.
때문에 리스트 중간에 삽입과 삭제가 빈번히 일어나는 프로그램을 작성할 때에는 ArrayList 대신 LinkedList 를 사용하는 것이 효율적입니다.
ArrayList<Integer> list = new ArrayList<>();
list.add(데이터);
list.add(인덱스, 데이터); // 인덱스 위치에 데이터 삽입
★ ArrayList 데이터 삭제
마찬가지로 remove 를 사용하여 중간의 데이터를 삭제하면 해당 인덱스부터 마지막 인덱스까지 1칸씩 앞으로 당겨집니다.
ArrayList<Integer> list = new ArrayList<>(Arrays.asList(1, 2, 3));
list.remove(인덱스); // 인덱스 위치 데이터 삭제
list.clear(); // 모든 데이터 삭제
★ ArrayList 크기
ArrayList 의 크기는 size() 메소드를 통해 구할 수 있습니다.
ArrayList list = new ArrayList(Arrays.asList(1, 2, 3));
System.out.println(list.size()); // 3
★ ArrayList 검색
ArrayList 내의 데이터를 검색할 때에는 contains() 메소드와 indexOf() 메소드를 사용할 수 있습니다.
contains() 메소드는 해당 데이터가 ArrayList 에 존재하는지 여부를 boolean 형으로 반환하며,
indexOf() 메소드는 해당 데이터의 index 를 반환합니다. 이때 데이터가 존재하지 않으면 -1을 반환합니다.
ArrayList list = new ArrayList(Arrays.asList(1, 2, 3));
boolean isContains = list.contains(1); // true, 1 이 있는지 검사
int findIndex = list.indexOf(1); // 0, 1의 위치 index 를 반환
★ ArrayList 데이터 접근
Array 에서 배열[인덱스] 와 같이 요소를 접근하는 것과 달리, ArrayList 는 get() 메소드를 이용하여 객체 내부의 데이터를 접근합니다.
접근하고자 하는 인덱스를 get() 메소드의 매개변수로 넘겨줍니다.
ArrayList list = new ArrayList(Arrays.asList(1, 2, 3));
// list.get(인덱스)
System.out.println(list.get(0)); // 1
★ ArrayList 출력
ArrayList 를 출력하는 방법은 다음과 같습니다.
ArrayList<Integer> list = new ArrayList<>(Arrays.asList(1, 2, 3));
// 객체명으로 출력
System.out.println(list); // [1, 2, 3]
System.out.println(list.toString()); // [1, 2, 3]
// for 문 + get() 메소드로 출력
for(int i = 0; i < list.size(); i++) {
System.out.print(list.get(i) + " ");
}
System.out.println();
// 1 2 3
// 향상된 for 문
for(Integer el : list) {
System.out.print(el + " ");
}
System.out.println();
// 1 2 3
// Iterator 인터페이스 사용
Iterator iter = list.iterator();
while(iter.hasNext()) {
System.out.print(iter.next() + " ");
}
System.out.println();
// 1 2 3