[JAVA]컬렉션

진섭·2023년 5월 11일
0
post-thumbnail

컬렉션

자바의 정석 책과 안드로이드 앱스쿨에서 공부한 내용을 정리한 내용입니다.

 

컬렉션 프레임웍

데이터 군을 저장하는 클래스들을 표준화한 설계를 뜻한다. 컬렉션 데이터 그룹을 크게 3가지 타입이 존재하고 Collection 인터페이스에 정의 되는 List, SetMap인터페이스가 있다.

  1. List : 순서가 있는 데이터의 집합,데이터의 중복을 허용한다.예)대기자 명단
  2. Set : 순서를 유지하지 않는 데이터의 집합, 데이터의 중복을 허용하지 않는다. 예) 양의 정수집합,소수의 집합
  3. Map : 키와 값의 쌍으로 이루어진 데이터의 집합 예) 우편번호, 지역번호

 

ArrayList

기존의 Vector를 개선한 것으로 Vecter와 구현원리와 기능적인 측면에서 동일하다고 할 수 있으며 Object배열을 이용해서 데이터를 순차적으로 저장한다.

그럼 Vector와 ArrayList의 차이점이 무엇인가?

  1. Vector는 한번에 하나의 스레드만 접근이 가능하지만 ArrayList는 동시에 여러 스레드가 작업할 수 있다.
  2. Vector는 동기화 되어있기 때문에 한번에 하나의 스레드만 접근할 수 있으며 ArrayList는 동기화 되지 않았기 때문에 명시적으로 동기화할 필요가 있다.
  3. ArrayList는 동기화 되지 않았기 때문에 Vector보다 빠르다.

인제 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);
		
	}

}

 

LinkedList

배열의 크기를 변경할 수 없는 단점비순차적인 데이터의 추가 또는 삭제에 시간이 많이 걸린다는 단점을 보완하기 위해서 Linked list 라는 자료구조가 고안되었다.

image

링크드 리스트의 각 요소들은 자신과 연결된 다음 요소에 대한 참조와 데이터로 구성되어 있다.

class Node{
	Node next;
	Object obj;
}

결론

  1. 순차적으로 추가/삭제하는 경우에는 ArrayList가 LinkedList보다 빠르다.
  2. 중간 데이터를 추가/삭제하는 경우에는 LinkedList가 ArrayList보다 빠르다.

Stack과 Queue

  1. 스택 : 마지막에 저장한 데이터를 가장 먼저 꺼내는 LIFO구조
  2. 큐 : 처음에 저장한 데이터를 가장 먼저 꺼내게 되는 FIFO구조

image

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 순으로 꺼내지게 됩니다.

0개의 댓글