ArrayList
List 인터페이스를 구현한다.
데이터의 순서 유지, 중복을 허용한다.
Vector 클래스와 동일하지만 오래된 버전이므로 ArrayList를 쓰면 된다.
Object[] 배열을 이용해서 데이터를 순차적으로 저장한다.
크기를 변경할 수 없다는 단점 때문에 배열에 더 이상 저장할 공간이 없다면 보다 큰 새로운 배열을 생성해서
기존의 배열에 저장된 내용을 새로운 배열로 복사한 다음 저장한다.
또 한 가지 단점이 있는데 비순차적인 데이터의 추가, 삭제에 많은 시간이 걸린다.
데이터를 원하는 위치에 추가하거나 처음 혹은 중간값들을 삭제하기 위해 다른 데이터를 옮기는 과정이 필요하다.
대신에 끝에 추가, 끝부터 삭제와 같은 작업은 빠르기 때문에 아래의 예제에서도 끝에 있는 값부터 삭제하는 것을 볼 수 있다.
ArrayList는 모든 종류의 객체를 배열로 저장한다.
그리고 Object 타입이기 때문에 모든 종류의 객체를 담을 수 있다.
중요한 점이 기본형은 지원하지 않는다는 것인데, 예제에서 보면 알 수 있듯이 기본형도 담을 수 있는 것을 확인할 수 있다.
어떻게 이런 일이 가능하냐?
list1.add(5); 라고 적어도 컴파일러가 자동으로 list1.add(new Integer(5)); 로 오토박싱해서 컴파일해주기 때문이다.
* Collection <-> Collections
Collection은 인터페이스 / Collections는 java.util 클래스
다양한 메서드를 활용한 예제를 살펴보자.
package java11;
import java.util.ArrayList;
import java.util.Collections;
public class Ex11_1 {
public static void main(String[] args) {
ArrayList list1 = new ArrayList(10); // 기본 길이가 10인 ArrayList 생성
// add(Object o): 맨 마지막에 객체를 추가
list1.add(new Integer(5));
list1.add(new Integer(4));
list1.add(new Integer(2));
list1.add(0); // 기본형임에도 불구하고 컴파일러가 자동으로 오토박싱하여 저장됨
list1.add(1);
list1.add(3);
// subList(int fromIndex, int toIndex): 사이에 저장된 객체 반환
ArrayList list2 = new ArrayList(list1.subList(1, 4));
print(list1, list2);
// Collections.sort(): 정렬 기능을 가지고 있는 Collections 클래스
Collections.sort(list1);
Collections.sort(list2);
print(list1, list2);
// containsAll(): 지정된 리스트가 포함되는지
System.out.println("list1.containsAll(list2): " + list1.containsAll(list2));
list2.add("B");
list2.add("C");
list2.add(3, "A"); // 인덱스가 3인 곳에 "A"를 추가
print(list1, list2);
// set(int index, Object element): element를 해당 index에 저장
list2.set(3, "AA"); // 값이 이미 있으니 A가 AA로 변경됨
print(list1, list2);
// retainAll(): list2와 공통된 것들만 남기고 모두 삭제
System.out.println("list1.retainAll(list2): " + list1.retainAll(list2));
print(list1, list2); // list1에서 중복된 값이 삭제됨
// size(): 저장된 객체의 갯수 반환
// contains(Object o): 객체가 포함되어 있는지
// remove(Object o): 지정된 객체를 제거
for(int i = list2.size()-1; i>=0; i--) { // int i=6; 0<=i; i--; (6,5,4,3,2,1)
if(list1.contains(list2.get(i))) // list1과 겹치는 객체가 있다면
list2.remove(i); // list1과 겹치는 객체(0,2,4)를 삭제한다
}
print(list1, list2);
// indexOf(): 지정된 객체가 저장된 위치를 찾아 반환
System.out.println("list2.indexOf(Object o): " + list2.indexOf("B"));
// get(): 지정된 위치에 저장된 객체를 찾아 반환
System.out.println("list2.get(int index): " + list2.get(1));
}
static void print(ArrayList list1, ArrayList list2) {
System.out.println("list1: " + list1);
System.out.println("list2: " + list2);
System.out.println();
}
}
Console
list1: [5, 4, 2, 0, 1, 3]
list2: [4, 2, 0]
list1: [0, 1, 2, 3, 4, 5]
list2: [0, 2, 4]
list1.containsAll(list2): true
list1: [0, 1, 2, 3, 4, 5]
list2: [0, 2, 4, A, B, C]
list1: [0, 1, 2, 3, 4, 5]
list2: [0, 2, 4, AA, B, C]
list1.retainAll(list2): true
list1: [0, 2, 4]
list2: [0, 2, 4, AA, B, C]
list1: [0, 2, 4]
list2: [AA, B, C]
list2.indexOf(Object o): 1
list2.get(int index): B
'JAVA' 카테고리의 다른 글
오류(error)와 예외(exception) (0) | 2020.12.10 |
---|---|
Iterator 인터페이스 (0) | 2020.12.04 |
컬렉션 프레임워크와 핵심 인터페이스 (0) | 2020.10.08 |
배열 (0) | 2020.09.30 |
break문과 continue문 (0) | 2020.09.30 |