컬렉션
자바의 정석 책과 안드로이드 앱스쿨에서 공부한 내용을 정리한 내용입니다.
데이터 군을 저장하는 클래스들을 표준화한 설계를 뜻한다. 컬렉션 데이터 그룹을 크게 3가지 타입이 존재하고 Collection
인터페이스에 정의 되는 List
, Set
과 Map
인터페이스가 있다.
기존의 Vector를 개선한 것으로 Vecter와 구현원리와 기능적인 측면에서 동일하다고 할 수 있으며 Object배열을 이용해서 데이터를 순차적으로 저장한다.
인제 ArrayList를 사용하는 예제를 작성하겠습니다.
public class MainClass {
public static void main(String[] args) {
ArrayList list1 = new ArrayList(10);
list1.add(new Integer(5));
list1.add(new Integer(4));
list1.add(new Integer(3));
list1.add(new Integer(2));
list1.add(new Integer(1));
list1.add(new Integer(0));
ArrayList list2 = new ArrayList(list1.subList(1, 4)); //4,3,2 까지
print(list1,list2);
Collections.sort(list1); // 정렬하기
Collections.sort(list2); //
print(list1,list2);
System.out.println(list1.containsAll(list2));//지정된 객체가 ArrayList에 포함되어 있는지 확인
list2.add("b"); //마지막에 객체 추가
list2.add("C");
list2.add(3,"A");
print(list1,list2);
list2.set(3, "AA"); //다른 객체로 변경
print(list1,list2);
System.out.println(list1.retainAll(list2));//retainAll에 의해 list1이 변화가 있었으므로 true
//list2에서 list1에 포함된 객체들을 삭제한다.
for(int i=list2.size()-1;i>=0;i--) {
if(list1.contains(list2.get(i)))
list2.remove(i);
}
print(list1,list2);
}
private static void print(ArrayList list1, ArrayList list2) {
System.out.println(list1);
System.out.println(list2);
}
}
배열의 크기를 변경할 수 없는 단점
과 비순차적인 데이터의 추가 또는 삭제에 시간이 많이 걸린다는 단점
을 보완하기 위해서 Linked list
라는 자료구조가 고안되었다.
링크드 리스트의 각 요소들은 자신과 연결된 다음 요소에 대한 참조와 데이터로 구성되어 있다.
class Node{
Node next;
Object obj;
}
public class MainClass {
public static void main(String[] args) {
Stack st = new Stack();
Queue q = new LinkedList();
st.push("0");
st.push("1");
st.push("2");
q.offer("0");
q.offer("1");
q.offer("2");
System.out.println("스택");
while(!st.empty()) {
System.out.println(st.pop());
}
System.out.println("큐");
while(!q.isEmpty()) {
System.out.println(q.poll());
}
}
}
//실행결과
스택
2
1
0
큐
0
1
2
실행 결과를 보면 알듯이 스택
객체를 만들고 push
로 0,1,2 순서대로 추가를 하였습니다. 그리고 하나씩 꺼내었을 때 마지막에 추가된 2가 꺼내지고 그다음 1 ..0 순으로 꺼내지게 됩니다. 큐
도 똑같이 객체를 만들고 0,1,2 순서대로 추가를 하고 꺼내게되면 큐는 처음에 추가된 0 -> 1 -> 2 순으로 꺼내지게 됩니다.