컬렉션(collection)
•
여러 객체(데이터)를 모아 놓은 것을 의미
프레임워크(framework)
•
표준화, 정형화된 체계적인 프로그래밍 방식
•
라이브러리(기능) + 프로그래밍 방식
컬렉션 프레임워크(colletions framework)
•
컬렉션(다수의 객체)을 다루기 위한 표준화된 프로그래밍 방식
•
컬렉션을 쉽고 편리하게 다룰 수 있는(저장, 삭제, 검색, 정렬) 다양한 클래스를 제공
•
java.util 패키지에 포함. (jdk1.2부터)
컬렉션 클래스(collection class)
•
컬렉션 프레임워크에서 제공하는 다양한 클래스
•
다수의 데이터를 저장할 수 있는 클래스 (ex. Vector, ArrayList, HashSet)
컬렉션 프레임워크의 핵심 인터페이스
Collection 인터페이스의 메서드
List 인터페이스 - 순서 O, 중복 O
•
ArrayList (=Vector), LinkedList
Set 인터페이스 - 순서 X, 중복 X
•
HashSet, TreeSet, SortedSet
•
Collection 인터페이스의 메서드와 동일.
•
추가로 집합과 관련된 메서드를 갖고 있음 (Collection에 변화가 있으면 true, 아니면 false)
Map 인터페이스 - 순서X, 중복(키X, 값O)
•
HashMap(=Hashtable), TreeMap, SortedMap, LinkedHashMap
ArrayList
•
ArrayList는 기존의 Vector를 개선한 것으로 구현원리와 기능적으로 동일
•
ArrayList와 달리 Vector는 자체적으로 동기화처리가 되어 있다
•
List인터페이스를 구현하므로 저장순서가 유지되고 중복을 허용한다
•
데이터 저장공간을 배열을 사용한다 (배열기반)
•
Obejct[] 이므로 객체만 저장 가능하다.
ArrayList에 저장된 객체의 삭제과정
•
1번 단계에서 부담이 많이 된다
•
앞에서부터 지우면 다 안 지워지고 느리다! 뒤에서부터!
ArrayList 배열의 장단점
•
장점
◦
배열은 구조가 간단하고 데이터를 읽는데 걸리는 시간(접근시간)이 짧다
•
단점
◦
크기를 변경할 수 없다 (새로운 배열 생성 후 데이터 복사해야함)
배열에서 남는 공간만큼 메모리 낭비
◦
비순차적인 데이터 추가, 삭제에 시간이 많이 걸린다 (다른 데이터를 옮겨가며 수행)
순차적인 데이터 추가(끝부분)와 삭제(끝부분)은 빠르다
LinkedList
•
ArrayList 배열의 단점을 보완
•
배열과 달리 불연속적으로 존재하는 데이터를 연결 (배열에 비해 접근성이 나쁘다..)
•
doubly linked list (이중 연결리스트, 접근성 향상)
•
doubly circular linked list (이중 원형 연결 리스트)
ArrayList(배열기반, 연속적) vs LinkedList(연결기반, 불연속적)
•
순차적으로 데이터를 추가/삭제 : ArrayList가 빠름
•
비순차적으로 데이터를 추가/삭제 : LinkedList가 빠름
•
접근시간 : ArrayList가 빠름
스택과 큐 (Stack & Queue)
•
스택 : LIFO구조로 마지막에 저장된 것을 제일 먼저 꺼내게 된다
◦
Stack st new Stack() 클래스라 가능
•
큐 : FIFO구조로 제일 먼저 저장한 것을 제일 먼저 꺼내게 된다
◦
Queue q = new Queue() 인터페이스라 불가능
•
ArrayList는 스택이 적합, Linked List는 큐가 적합
Stack의 메서드
•
peek은 가장 위에 있는 (나중에 들어온) 객체 확인
•
search는 가장 위에 있는 (나중에 들어온) 객체를 1부터 시작해서 검색
Queue의 메서드
•
peek은 가장 아래 있는 객체 확인
Iterator, ListIterator, Enumeration
•
컬렉션에 저장된 데이터를 접근하는데 사용되는 인터페이스
•
컬렉션에 저장된 요소들을 읽어오는 방법을 표준화한 것
•
컬렉션에 iterator()를 호출해서 Iterator를 구현한 객체를 얻어서 사용
•
Enumeration은 Iterator의 구버전
•
ListIterator는 Iterator의 접근성을 향상시킨 것 (단방향 → 양방향)
(next와 previous를 둘 다 갖고 있음)
Map과 Iterator
•
Map에는 Iterator()가 없다. keySet(), entrySet(), values()를 호출해야 한다
Arrays - 배열을 다루기 편리한 메서드(static) 제공
Comparator와 Comparable
•
객체 정렬에 필요한 메서드(정렬기준 제공)를 정의한 인터페이스
◦
Comparable : 기본 정렬기준(사전순, 오름차순 )을 구현하는데 사용
◦
Comparator : 기본 정렬기준 외에 다른 기준으로 정렬하고자 할 때 사용
•
compare()와 compareTo()는 두 객체의 비교결과를 반환하도록 작성
(같으면 0, 오른쪽이 크면 -, 오른쪽이 작으면 +)
HashSet - 순서 X, 중복 X
•
Set 인터페이스를 구현한 대표적인 컬렉션 클래스
•
순서를 유지하려면 LinkedHashSet 클래스를 사용하면 된다
•
HashSet은 객체를 저장하기 전에 기존에 같은 객체가 있는지 확인한다
(같은 객체가 없으면 저장하고 있으면 저장하지 않는다)
•
boolean add(Object o)는 저장할 객체의 equals()와 hashCode()를 호출한다
(단, equals()와 hashCode()가 오버라이딩 되어 있어야함!!)
•
setA.retainAll(setB); //교집합. 공통된 요소만 남기고 삭제
•
setA.addAll(setB); //합집합. setB의 모든 요소를 추가(중복 제외)
•
setA.removeAll(setB); //차집합. setB와 공통 요소를 제거
TreeSet
•
이진 탐색 트리(binary search tree)로 범위 탐색과 정렬에 유리한 컬렉션 클래스
•
이진 트리는 모든 노드가 최대 2개의 하위 노드를 갖는다
(부모보다 작은 값은 왼쪽, 큰 값은 오른쪽에 저장)
•
데이터가 많아질 수록 HashSet 보다 데이터 추가, 삭제에 시간이 더 걸린다
•
boolean add(Object o)는 저장할 객체의 compare()를 호출한다
TreeSet의 주요 생성자와 메서드
HashMap과 Hashtable - 순서X, 중복(키X, 값O)
•
Map 인터페이스를 구현. 데이터를 키와 값의 쌍으로 저장
•
HashMap(동기화X)은 Hashtable(동기화O)의 신버전
•
HashMap
◦
Map 인터페이스를 구현한 대표적인 컬렉션 클래스
◦
순서를 유지하려면 LinkedHashMap 클래스를 사용하면 된다
•
TreeMap (= TreeSet)
◦
범위 검색과 정렬에 유리한 컬렉션 클래스
◦
HashMap보다 데이터 추가, 삭제에 시간이 더 걸린다
HashMap의 키(Key)와 값(Value)
•
해싱(Hashing)기법으로 데이터를 저장. 데이터가 많아도 검색이 빠르다
•
Map 인터페이스를 구현. 데이터를 키와 값의 쌍(Entry)으로 저장
•
값(Value)는 새로운 값이 입력되면 덮어씌워진다
Hashing
•
해시 함수를 이용해서 해시 테이블에 데이터를 저장하고 검색하는 것
•
해시 함수 : 키를 이용해서 저장 위치(배열의 인덱스)인 해시 코드를 반환한다
(해시 함수는 같은 키에 대해 항상 같은 해시 코드를 반환한다)
(서로 다른 키일지라도 같은 값의 해시 코드를 반환할 수도 있다)
•
해시 테이블 : 배열과 링크드 리스트가 조합된 형태이다 (접근성 + 변경 간편)
HashMap의 주요 메서드
Collections
•
컬렉션을 위한 메서드(static)를 제공
•
컬렉션 채우기, 복사, 정렬, 검색 : fill(), copy(), sort(), binarySearch() 등
•
컬렉션 동기화 : synchronizedXXX()
•
변경불가(readOnly) 컬렉션 만들기 : unmidifiableXXX()
•
싱글톤 컬렉션 만들기 : singletonXXX()
•
한 종류의 객체만 저장하는 컬렉션 만들기 : checkedXXX()
컬렉션 클래스 정리