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);
}
}
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);
}
}
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);
}
}
'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 |