본문 바로가기

JAVA

11장- 컬렉션 프레임웍 21 . 02. 08.

1. 컬렉션 프레임웤

컬렉션 프레임웍: 데이터 군을 저장하는 클래스들을 표준화한 설계

 

1.1 컬렉션 프레임웤의 핵심 인터페이스

인터페이스

  • List- 순서가 있는 데이터의 집합. 데이터의 중복을 허용 예) 대기자 명단

     구현클래스: ArrayList, LinkedList, Stack, Vector 등

 

  • Set- 순서를 유지하지 않는 데이터의 집합. 데이터의 중복을 허용하지 않음. (인덱스 개념이 없음) 예) 양의 정수집합, 소수의 집합

     구현클래스: HashSet, TreeSet 등

 

  • Map- 키(key)와 값(value)의 쌍(pair)으로 이루어진 데이터의 집합. 순서는 유지되지 않으며, 키는 중복을 허용하지 않고, 중복을 허용. 예) 우편번호, 지역번호(전화번호)

     구현클래스: HashMap, TreeMap, Hashtable, Properties 등

 

Vector나 Hashtable은 옛날 것. ArrayList와 HashMap 사용하기!

 

Collection인터페이스

List와 Set의 조상.

메서드 p.580

  • Iterator iterator( )- 반복자(순회자). Collection의 iterator를 얻어서 반환함.

List인터페이스 (배열 생각하면 됨.)

중복을 허용하면서 저장순서가 유지되는 컬렉션을 구현하는데 사용됨.

package chap11;

import java.util.ArrayList;

public class Pr1 {
	public static void main(String[] args) {
		int[] arr = new int[5];
		ArrayList<Integer> list = new ArrayList<>();
		ArrayList<String> list2 = new ArrayList<>();
		
		list.add(new Integer(3));
		System.out.println(list);
		list.add(5);
		list.add(3);
		list.add(7);
		list.add(8);
		list.add(2);
		System.out.println(list);
	}
}

 

CollectionEx1.java

package chap11;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class Pr2 {
	public static void main(String[] args) {
		// 수정 .set()
		// 조회 .get()
		
		List<Integer> list = new ArrayList<>();
		list.add(10);
		list.add(20);
		list.add(30);
		list.add(40);
		list.add(50);
		System.out.println(list);
		
		for (int i = 0 ; i < list.size() ; i++) {
			System.out.println(list.get(i));
		}
		list.set(2, 80);
		System.out.println(list);
		
		list.add(2, 90);
		System.out.println(list); // index 2에 90 들어오면서 기존 80은 index3으로 감.
		
		list.remove(0);
		System.out.println(list);
		
		list.add(50);
		System.out.println(list); // 중복 상관 없음. 인덱스로 구분.
		list.add(50);
		list.add(50);
		list.add(50);
		System.out.println(list.indexOf(50)); // 값 50이 인덱스 몇 번인지. 값을 찾으면 스톱. 뒤에 중복값이 있어도 더 찾지 않음.
		System.out.println(list.lastIndexOf(50));
		
		List<String> list2 = new ArrayList<>();
		list2.add("둘리");
		list2.add("도우너");
		list2.add("또치");
		list2.add("고길동");
		list2.add("희동이");
		System.out.println(list2);
		
		list2.remove(3);
		System.out.println(list2);
		list2.remove("둘리");
		System.out.println(list2);
		System.out.println("-------");
		Integer[] arr = new Integer[list.size()];
		list.toArray(arr);
		System.out.println(arr.length);
		System.out.println(Arrays.toString(arr));
		
		List<Integer> list3 = Arrays.asList(arr); // 배열을 List로 변환
		System.out.println(list3);
	}
}

CollectionEx2.java

package chap11;

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;

public class pr3 {
	public static void main(String[] args) {
		// ArrayList와 LinkedList 읽기 쓰기 속도 비교
		LinkedList<String> linkedList = new LinkedList<>();
		ArrayList<String> arrayList = new ArrayList<>(1_000_000);
		
		// 100만개 추가
		System.out.println("순차추가");
		System.out.println("arrayList: " + add(arrayList) + "ms");
		System.out.println("linkedList: " + add(linkedList) + "ms");
		
		// 1만개 추가
		System.out.println("중간추가");
		System.out.println("arrayList: " + add2(arrayList) + "ms");
		System.out.println("linkedList: " + add2(linkedList) + "ms");
		
		// 101만개 조회
		System.out.println("중간추가");
		System.out.println("arrayList: " + add2(arrayList) + "ms");
		System.out.println("linkedList: " + add2(linkedList) + "ms");
		
		ArrayList<String> tmp = new ArrayList<>(linkedList);
		LinkedList<String> tmp2 = new LinkedList<>(arrayList); // 서로 바꿀 수 있음.
		
		// 1만개 삭제
		System.out.println("중간삭제");
		System.out.println("arrayList: " + remove(arrayList) + "ms");
		System.out.println("linkedList: " + remove(linkedList) + "ms");
		
		// 100만개 삭제
		System.out.println("순차삭제");
		System.out.println("arrayList: " + remove2(arrayList) + "ms");
		System.out.println("linkedList: " + remove2(linkedList) + "ms");
		
	}
	
	static long add (List<String> list) {
		long start = System.currentTimeMillis();
		for (int i = 0; i < 100_000 ; i++) {
			list.add(i+"");
		}
		long end = System.currentTimeMillis();
		return end - start;
	}
	static long add2 (List<String> list) {
		long start = System.currentTimeMillis();
		for (int i = 0; i < 10_000 ; i++) {
			list.add(i+"");
		}
		long end = System.currentTimeMillis();
		return end - start;
	}
	static long remove (List<String> list) {
		long start = System.currentTimeMillis();
		for (int i = 0; i < 10_000 ; i++) {
			list.remove(i);
			}
		long end = System.currentTimeMillis();
		
		return end - start;
	}
	// 순차삭제
	static long remove2 (List<String> list) {
		long start = System.currentTimeMillis();
		for (int i = list.size() - 1; i > 0 ; i--) {
			list.remove(i);
		}
		long end = System.currentTimeMillis();
		return end - start;
	}
	// 조회
	static long access (List<String> list) {
		long start = System.currentTimeMillis();
		for (int i = 0; i < list.size() ; i++) {
			list.get(i);
		}
		long end = System.currentTimeMillis();
		return end - start;
	}
}

 

 

 

1.4 Stack과 Queue

스택- LIFO (후입선출). 저장(push), 추출(pop)

큐- FIFO (선입선출). 저장(offer), 추출(poll)

 

순차적으로 데이터를 추가하고 삭제하는 스택에는 ArrayList와 같은 배열기반의 컬렉션 클래스가 적합하지만,

큐는 데이터를 꺼낼 때 항상 첫 번째 저장된 데이터를 삭제하므로, ArrayList와 같은 배열기반의 컬렉션 클래스를 사용한다면 데이터를 꺼낼 때마다 빈 공간을 채우기 위해 데이터으 복사가 발생하므로 비효율적.

즉, 는 데이트 추가/삭제가 쉬운 LinkedList로 구현하는 것이 더 적합.

 

* Stack의 메서드

boolean empty( )

 

Object peek( ) - Stack의 맨 위에 저장된 객체를 반환. pop( )과 달리 Satack에서 객체를 꺼내지는 않음. (비었을 때는 EmptyStackException 발생)

 

Object pop( ) - Stack의 맨 위에 저장된 객체를 꺼낸다. (비었을 때 EmptyStackException 발생)

 

Object push(Objecct item) - Stack에 객체(item)를 저장함.

 

int search(Object o) - Stack에서 주어진 객체(o)를 찾아서 그 위치를 반환. 못찾으면 -1을 반환. (배열과 달리 위치는 0이 아닌 1부터 시작.)

 

 

*Queue의 메서드

 

boolean add(Object o) - 저장공간 부족하면 lllegalStateException 발생

 

Object remove( ) - Queue에서 객체를 꺼내 반환. 비어있으면 NoSuchElementException 발생

 

Objcet element( ) - 삭제없이 요소를 읽어옴. peek과 달리 Queue가 비었을 때 NoSuchElementException 발생

 

boolean offer(Object o) - Queue에 객체를 저장.

 

Object poll( ) - Queue에서 객체를 꺼내서 반환. 비어있으면 null을 반환.

 

Object peek( ) - 삭제없이 요소를 읽어 옴. Queue가 비어있으면 null을 반환.

package chap11;

import java.util.LinkedList;
import java.util.Queue;
import java.util.Stack;

public class Pr4 {
	public static void main(String[] args) {
		Stack<Integer> stack = new Stack<>();
		Queue<Integer> queue = new LinkedList<>();
		
		stack.push(1);
		stack.push(2);
		stack.push(3);
		
		queue.offer(1);
		queue.offer(2);
		queue.offer(3);
		System.out.println(stack);
		System.out.println(queue);
		System.out.println("--------");
		System.out.println(stack.pop());
		System.out.println(stack.pop());
		System.out.println(stack.pop());
		
		System.out.println(queue.poll());
		System.out.println(queue.poll());
		System.out.println(queue.poll());
		
		System.out.println(stack);
		System.out.println(queue);
	}
}

CollectionEx4

 

 

'JAVA' 카테고리의 다른 글

15장- 입출력 I/O 끝 21. 02. 16.  (0) 2021.02.17
15장- 입출력 I/O 21. 02. 15.  (0) 2021.02.15
04장- 조건문과 반복문 21. 02. 03.  (0) 2021.02.04
21. 01. 27. 03장- 연산자  (0) 2021.01.27
02장- 변수 21. 01. 23.  (0) 2021.01.27