Collection Framework
데이터 군을 저장하는 클래스들을 표준화한 설계
컬렉션 Collection : 다수의 데이터. 데이터 그룹
프레임웍 Framework : 표준화된 프로그래밍 방식.
Class ArrayList
List 인터페이스를 구현한 클래스
저장된 순서를 유지한다.
기존의 Vector를 개선한 클래스
Vector와는 구현원리와 기능적인 측면에서 동일하다.
읽고 저장하는 것에 효율적이다.
Object 배열을 이용하여 데이터를 순차적으로 저장한다.
용량 변경에 비효율적이다.
처음 인스턴스 생성 시, 저장할 데이터의 개수를 잘 고려하여 충분한 용량의 인스턴스를 생성한다.
자동적으로 크기가 늘어나긴 하지만 그 과정에서 처리시간이 많이 소요된다.
Java
1
2
3
4
5
6
public class ArrayList<E> extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, java.io.Serializable {
...
transient Object[] elementData;
...
}elementDate라는 이름의 Object 배열을 멤버변수로 선언. 모든 종류의 객체를 담을 수 있다.
Public constructors
| 생성자 | 설명 |
|---|---|
| ArrayList(int initialCapacity) | 지정된 초기 용량을 갖는 ArrayList 생성 |
| ArrayList() | 크기가 10인 ArrayList 생성 |
| ArrayList(Collection<? extends E> c) | 주어진 컬렉션이 저장된 ArrayList 생성 |
Public methods
| 반환 타입 | 이름 | 설명 |
|---|---|---|
| boolean | add(E e) | ArrayList의 마지막에 객체를 추가. 성공하면 true |
| void | add(int index, E element) | 지정된 위치에 객체 추가 |
| boolean | addAll(Collection<? extends E> c) | 주어진 컬렉션의 모든 객체 추가 |
| boolean | addAll(int index, Collection<? extends E> c) | 지정된 위치부터 주어진 컬렉션의 모든 객체 추가 |
| void | clear() | ArrayList를 완전히 비운다 |
| Object | clone() | ArrayList 복제 |
| boolean | contains(Object o) | 지정된 객체가 ArrayList에 포함되어 있는 지 확인 |
| void | ensureCapacity(int minCapacity) | ArrayList의 용량이 최소한 minCapacity가 되도록 한다 |
| E | get(int index) | 지정된 위치에 저장된 객체를 반환 |
| int | indexOf(Object o) | 지정된 객체가 저장된 위치를 찾아 반환 |
| boolean | isEmpty() | ArrayList가 비어있는 지 확인 |
| Iterator | iterator() | ArrayList의 Iterator 객체를 반환 |
| int | lastIndexOf(Object o) | 객체가 저장된 위치를 끝부터 역방향으로 검색해서 반환 |
| ListIterator | listIterator(int index) | ArrayList의 지정된 위치부터 시작하는 ListIterator를 반환 |
| ListIterator | listIterator() | ArrayList의 ListIterator를 반환 |
| E | remove(int index) | 지정된 위치에 있는 객체를 제거 |
| boolean | remove(Object o) | 지정한 객체를 제거. 성공하면 true |
| boolean | removeAll(Collection<?> c) | 지정한 컬렉션에 저장된 것과 동일한 객체들을 제거 |
| boolean | removeIf(Predicate<? super E> filter) | 지정된 조건과 일치하는 컬렉션의 모든 객체 제거 |
| E | set(int index, E element) | 지정된 위치에 객체 저장 |
| int | size() | ArrayList에 저장된 객체의 개수를 반환 |
| void | sort(Comparator<? super E> c) | 지정된 정렬 기준으로 ArrayList 정렬 |
| List | subList(int fromIndex, int toIndex) | fromIndex부터 toIndex 사이에 저장된 객체를 반환 |
| Object[] | toArray() | ArrayList에 저장된 모든 객체들을 객체 배열로 반환 |
| T[] | toArray(T[] a) | ArrayList에 저장된 모든 객체들을 객체 배열 a에 담아 반환 |
| void | trimToSize() | 용량을 크기에 맞게 줄인다. 빈 공간 제거 |
Example01 - 기본적인 메서드로 객체 다루기
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
import java.util.Collections;
import java.util.ArrayList;
public class Test {
public static void main(String[] args){
ArrayList<String> list1 = new ArrayList<>();
for (int i = 0; i < 5; ++i) {
list1.add(String.valueOf((int) (Math.random() * 10)));
}
ArrayList<String> list2 = new ArrayList<>(list1.subList(1, 4));
System.out.println("list1 : " + list1 + ", list2 : " + list2);
// list1 : [6, 8, 0, 2, 6], list2 : [8, 0, 2]
Collections.sort(list1);
Collections.sort(list2);
System.out.println("list1 : " + list1 + ", list2 : " + list2);
// list1 : [0, 2, 6, 6, 8], list2 : [0, 2, 8]
System.out.println(list1.containsAll(list2)); // true
list2.add("B");
list2.add("C");
list2.add(3, "add");
System.out.println("list1 : " + list1 + ", list2 : " + list2);
// list1 : [0, 2, 6, 6, 8], list2 : [0, 2, 8, add, B, C]
list2.set(3, "set");
System.out.println("list1 : " + list1 + ", list2 : " + list2);
// list1 : [0, 2, 6, 6, 8], list2 : [0, 2, 8, set, B, C]
System.out.println(list1.retainAll(list2)); // true
System.out.println("list1 : " + list1 + ", list2 : " + list2);
// list1 : [0, 2, 8], list2 : [0, 2, 8, set, B, C]
}
}add(int index, E element) : 객체 추가. 지정된 위치에서부터 기존 데이터들이 뒤로 밀려난다.
set(int index, E element) : 객체 저장. 지정된 위치에 기존 데이터가 있으면 새로운 데이터로 바꿔 저장한다.
Collections 클래스의 sort(List<T> list) : List에 저장된 객체들을 정렬한다.
Example02 - 공통요소 찾아서 삭제하기
!! 한 요소가 삭제될 때마다 빈 공간을 채우기 위해 나머지 요소들이 자리 이동을 한다.
Java
1
2
3
4
5
for (int i = list2.size() - 1; i >= 0; i--) {
if (list1.contains(list2.get(i))) {
list2.remove(i);
}
}Plain Text
1
2
// 전 - list1 : [0, 2, 8], list2 : [0, 2, 8, set, B, C]
// 후 - list1 : [2, 7, 8], list2 : [set, B, C]만일 제어변수를 증가시켜가면서 삭제하면,
한 요소가 삭제될 때마다 자리 변동이 일어나 올바른 결과를 얻을 수 없다.
제어변수를 감소시켜가면서 삭제해야 자리 이동이 발생해도 영향을 받지 않고 작업이 가능하다.
Example03 - 문자열 데이터를 원하는 길이로 잘라서 ArrayList에 담기
ArrayList의 크기는 실제 저장할 개수보다 약간 여유 있게 하는 것이 좋다.
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import java.util.ArrayList;
import java.util.List;
public class Test {
public static void main(String[] args){
final int LIMIT = 10;
String source = "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
int length = source.length();
List<String> list = new ArrayList<>(length / LIMIT + 10);
for (int i = 0; i < length; i += LIMIT) {
if (i + LIMIT < length) {
list.add(source.substring(i, i + LIMIT));
} else {
list.add(source.substring(i));
}
}
for (String s : list) {
System.out.println(s);
}
}
}Plain Text
1
2
3
4
5
6
7
abcdefghij
klmnopqrst
uvwxyz0123
456789ABCD
EFGHIJKLMN
OPQRSTUVWX
YZ참고 서적: 자바의 정석 3판 2

[Java] Collection Framework
Java에서 데이터 군을 저장하는 클래스들을 표준화한 설계도 Collection Framework를 설명한 글입니다.
Java

[HTML5] Content categories (컨텐츠 범주)
HTML5 에서 사용하는 테그 의 컨텐츠 범주를 정리해놓은 글입니다.
HTML
