(collection framework) Java 의 정석 Chapter 11. 컬렉션 프레임웍(collection framework) http://www.javachobo.com Java의 정석 제 11 장 컬렉션 프레임웍 (collection framework) 안녕하십니까? 자바의 정석의 저자 남궁성입니다. 지금부터 제7장 객체지향개념2의 두 번째 강의를 시작하겠습니다. 2009. 8. 29 남궁성 강의 castello@naver.com
1.1 컬렉션 프레임웍(collection framework)이란? Java 의 정석 Chapter 11. 컬렉션 프레임웍(collection framework) http://www.javachobo.com 1.1 컬렉션 프레임웍(collection framework)이란? ▶ 컬렉션 프레임웍(collection framework) - 데이터 군(群)을 저장하는 클래스들을 표준화한 설계 - 다수의 데이터를 쉽게 처리할 수 있는 방법을 제공하는 클래스들로 구성 - JDK1.2부터 제공 ▶ 컬렉션(collection) - 다수의 데이터, 즉, 데이터 그룹을 의미한다. ▶ 프레임웍(framework) - 표준화, 정형화된 체계적인 프로그래밍 방식 ▶ 컬렉션 클래스(collection class) - 다수의 데이터를 저장할 수 있는 클래스(예, Vector, ArrayList, HashSet) 2 2
Java 1.2 컬렉션 프레임웍의 핵심 인터페이스 정석 의 Chapter 11. 컬렉션 프레임웍(collection framework) http://www.javachobo.com 1.2 컬렉션 프레임웍의 핵심 인터페이스 3 3
1.3 컬렉션 프레임웍의 동기화(synchronization) Java 의 정석 Chapter 11. 컬렉션 프레임웍(collection framework) http://www.javachobo.com 1.3 컬렉션 프레임웍의 동기화(synchronization) - 멀티쓰레드 프로그래밍에서는 컬렉션 클래스에 동기화 처리가 필요하다. - Vector와 같은 구버젼 클래스들은 자체적으로 동기화처리가 되어 있다. - ArrayList와 같은 신버젼 클래스들은 별도의 동기화처리가 필요하다. - Collections클래스는 다음과 같은 동기화 처리 메서드를 제공한다. 4 4
Java 1.4 Vector와 ArrayList 정석 의 정석 Chapter 11. 컬렉션 프레임웍(collection framework) http://www.javachobo.com 1.4 Vector와 ArrayList - ArrayList는 기존의 Vector를 개선한 것으로 구현원리와 기능적으로 동일 - List인터페이스를 구현하므로, 저장순서가 유지되고 중복을 허용한다. - 데이터의 저장공간으로 배열을 사용한다.(배열기반) - Vector는 자체적으로 동기화처리가 되어 있으나 ArrayList는 그렇지 않다. 5 5
Java 1.4 Vector – 주요메서드(1/2) 정석 의 Chapter 11. 컬렉션 프레임웍(collection framework) http://www.javachobo.com 1.4 Vector – 주요메서드(1/2) 6 6
Java 1.4 Vector – 주요메서드(2/2) 정석 의 Chapter 11. 컬렉션 프레임웍(collection framework) http://www.javachobo.com 1.4 Vector – 주요메서드(2/2) 7 7
Java 1.5 ArrayList사용예 정석 의 Chapter 11. 컬렉션 프레임웍(collection framework) http://www.javachobo.com 1.5 ArrayList사용예 8 8
1.6 Vector의 크기(size)와 용량(capacity) Java 의 정석 Chapter 11. 컬렉션 프레임웍(collection framework) http://www.javachobo.com 1.6 Vector의 크기(size)와 용량(capacity) ① ② ③ ⑤ ④ 9 9
Java 1.7 Vector에 저장된 객체의 삭제과정 정석 의 Chapter 11. 컬렉션 프레임웍(collection framework) http://www.javachobo.com 1.7 Vector에 저장된 객체의 삭제과정 - Vector에 저장된 세 번째 데이터(data[2])를 삭제하는 과정. v.remove(2);를 호출 ① 삭제할 데이터 아래의 데이터를 한 칸씩 위로 복사해서 삭제할 데이터를 덮어쓴다. ② 데이터가 모두 한 칸씩 이동했으므로 마지막 데이터는 null로 변경한다. ③ 데이터가 삭제되어 데이터의 개수가 줄었으므로 size의 값을 감소시킨다. ※ 삭제할 데이터가 마지막 데이터인 경우, ①의 과정은 필요없다. 10 10
Java 1.8 ArrayList의 단점 - 배열의 단점 정석 Chapter 11. 컬렉션 프레임웍(collection framework) http://www.javachobo.com 1.8 ArrayList의 단점 - 배열의 단점 - 배열은 구조가 간단하고 데이터를 읽어오는 데 걸리는 시간(접근시간, access time)이 가장 빠르다는 장점이 있지만 단점도 있다. ▶ 단점 1 : 크기를 변경할 수 없다. - 크기를 변경해야 하는 경우 새로운 배열을 생성하고 데이터를 복사해야 한다.(비용이 큰 작업) - 크기 변경을 피하기 위해 충분히 큰 배열을 생성하면, 메모리 낭비가 심해진다. ▶ 단점 2 : 비순차적인 데이터의 추가, 삭제에 시간이 많이 걸린다. - 데이터를 추가하거나 삭제하기 위해, 많은 데이터를 옮겨야 한다. - 그러나, 순차적인 데이터 추가(마지막에 추가)와 순차적으로 데이터를 삭제하는 것(마지막에서부터 삭제)은 빠르다. 11 11
1.9 Deep copy vs. Shallow copy Java 의 정석 Chapter 11. 컬렉션 프레임웍(collection framework) http://www.javachobo.com 1.9 Deep copy vs. Shallow copy ▶ Deep copy(깊은 복사) : 같은 내용의 새로운 객체를 생성. 원본의 변화에 복사본이 영향을 받지 않는다. ▶ Shallow copy(얕은 복사) : 참조변수만 복사. 원본의 변화에 복사본이 영향을 받는다. 12 12
Java 1.10 LinkedList - 배열의 단점을 보완 정석 Chapter 11. 컬렉션 프레임웍(collection framework) http://www.javachobo.com 1.10 LinkedList - 배열의 단점을 보완 - 배열과 달리 링크드 리스트는 불연속적으로 존재하는 데이터를 연결(link) ▶ 데이터의 삭제 : 단 한 번의 참조변경만으로 가능 ▶ 데이터의 추가 : 하나의 Node객체생성과 한 번의 참조변경만으로 가능 13 13
1.11 LinkedList – 이중 원형 링크드 리스트 Java 의 정석 Chapter 11. 컬렉션 프레임웍(collection framework) http://www.javachobo.com 1.11 LinkedList – 이중 원형 링크드 리스트 ▶ 링크드 리스트(linked list) – 연결리스트. 데이터 접근성이 나쁨 ▶ 더블리 링크드 리스트(doubly linked list) – 이중 연결리스트, 접근성 향상 ▶ 더블리 써큘러 링크드 리스트(doubly circular linked list) – 이중 원형 연결리스트 14 14
Java 1.11 LinkedList – 주요메서드(1/2) 정석 의 Chapter 11. 컬렉션 프레임웍(collection framework) http://www.javachobo.com 1.11 LinkedList – 주요메서드(1/2) 15 15
Java 1.11 LinkedList – 주요메서드(2/2) 정석 의 Chapter 11. 컬렉션 프레임웍(collection framework) http://www.javachobo.com 1.11 LinkedList – 주요메서드(2/2) 16 16
1.12 ArrayList vs. LinkedList Java 의 정석 Chapter 11. 컬렉션 프레임웍(collection framework) http://www.javachobo.com 1.12 ArrayList vs. LinkedList - 순차적으로 데이터를 추가/삭제하는 경우, ArrayList가 빠르다. - 비순차적으로 데이터를 추가/삭제하는 경우, LinkedList가 빠르다. - 접근시간(access time)은 ArrayList가 빠르다. 17 17
Java 1.13 스택과 큐(Stack & Queue) 정석 의 정석 Chapter 11. 컬렉션 프레임웍(collection framework) http://www.javachobo.com 1.13 스택과 큐(Stack & Queue) ▶ 스택(Stack) : LIFO구조. 마지막에 저장된 것을 제일 먼저 꺼내게 된다. - 수식계산, 수식괄호검사, undo/redo, 뒤로/앞으로(웹브라우져) ▶ 큐(Queue) : FIFO구조. 제일 먼저 저장한 것을 제일 먼저 꺼내게 된다. - 최근 사용문서, 인쇄작업대기목록, 버퍼(buffer) 18 18
1.14 Enumeration, Iterator, ListIterator Java 의 정석 Chapter 11. 컬렉션 프레임웍(collection framework) http://www.javachobo.com 1.14 Enumeration, Iterator, ListIterator - 컬렉션 클래스에 저장된 데이터를 접근하는데 사용되는 인터페이스이다. - Enumeration는 Iterator의 구버젼이다. - Iterator의 접근성을 향상시킨 것이 ListIterator이다.(단방향 →양방향) 19 19
Java 1.15 Iterator 정석 - 컬렉션 클래스에 저장된 요소들을 나열하는 방법을 제공. 의 정석 Chapter 11. 컬렉션 프레임웍(collection framework) http://www.javachobo.com 1.15 Iterator - 컬렉션 클래스에 저장된 요소들을 나열하는 방법을 제공. - 컬렉션 클래스의 iterator()를 호출해서 Iterator를 구현한 객체를 얻는다. 20 20
1.16 ListIterator – Iterator의 기능을 확장(상속) Java 의 정석 Chapter 11. 컬렉션 프레임웍(collection framework) http://www.javachobo.com 1.16 ListIterator – Iterator의 기능을 확장(상속) - Iterator의 접근성을 향상시킨 것이 ListIterator이다.(단방향 →양방향) - listIterator()를 통해서 얻을 수 있다.(List를 구현한 컬렉션 클래스에 존재) 21 21
Java 1.17 HashSet – 중복허용×, 순서유지× 정석 의 정석 Chapter 11. 컬렉션 프레임웍(collection framework) http://www.javachobo.com 1.17 HashSet – 중복허용×, 순서유지× - Set인터페이스를 구현한 대표적인 컬렉션 클래스.(중복허용×, 순서유지×) - 순서를 유지하고자 한다면, LinkedHashSet클래스를 사용해야 한다. 22 22
1.17 HashSet – boolean add(Object o) Java 의 정석 Chapter 11. 컬렉션 프레임웍(collection framework) http://www.javachobo.com 1.17 HashSet – boolean add(Object o) - HashSet에 객체를 저장할 때 boolean add(Object o)를 사용하며, 기존에 저장된 객체와 중복된 객체를 저장하면 false를 반환한다. boolean add(Object o)는 저장할 객체의 equals()와 hashCode()를 호출하므로 저장할 객체의 equals()와 hashCode()가 적절히 오버라이딩되어 있어야 한다. 그렇지 않으면 중복된 객체를 중복된 것으로 간주하지 않을 수 있다. 23 23
1.17 HashSet – int hashCode() Java 의 정석 Chapter 11. 컬렉션 프레임웍(collection framework) http://www.javachobo.com 1.17 HashSet – int hashCode() ▶ 동일 객체에 대해 hashCode()를 여러 번 호출해도 동일한 값을 반환해야 한다. ▶ equals()로 비교해서 true를 얻은 두 객체의 hashCode()값은 일치해야 한다. ▶ equals()로 비교해서 false를 얻은 두 객체의 hashCode()값은 서로 다른 것이 보통이지만, 같아도 문제없다. 그러나 성능향상을 위해 가능하면 서로 다른 값을 반환하도록 오버라이딩하자. 24 24
Java 1.18 TreeSet – 검색과 정렬에 유리 정석 의 정석 Chapter 11. 컬렉션 프레임웍(collection framework) http://www.javachobo.com 1.18 TreeSet – 검색과 정렬에 유리 - Set인터페이스를 구현한 컬렉션 클래스.(중복허용×, 순서유지×, 정렬저장○) - 이진검색트리(binary search tree - 정렬, 검색에 유리)의 구조로 되어있다. - 링크드리스트와 같이 각 요소(node)가 나무(tree)형태로 연결된 구조 - 모든 트리는 하나의 루트(root node)를 가지며, 서로 연결된 두 요소를 ‘부모-자식관계’에 있다 하고, 하나의 부모에 최대 두 개의 자식을 갖는다. - 왼쪽 자식의 값은 부모의 값보다 작은 값을, 오른쪽 자식의 값은 부모보다 큰 값을 저장한다. - 검색과 정렬에 유리하지만, HashSet보다 데이터 추가, 삭제시간이 더 걸린다. 25 25
Java 1.18 TreeSet – 주요메서드 정석 의 Chapter 11. 컬렉션 프레임웍(collection framework) http://www.javachobo.com 1.18 TreeSet – 주요메서드 26 26
Java 1.18 TreeSet – 데이터 저장과정 정석 의 정석 Chapter 11. 컬렉션 프레임웍(collection framework) http://www.javachobo.com 1.18 TreeSet – 데이터 저장과정 ※만일 TreeSet에 7,4,9,1,5의 순서로 데이터를 저장한다면, 다음과 같은 과정을 거치게 된다. 27 27
1.19 Comparator와 Comparable Java 의 정석 Chapter 11. 컬렉션 프레임웍(collection framework) http://www.javachobo.com 1.19 Comparator와 Comparable ▶ 객체를 정렬하는데 필요한 메서드를 정의한 인터페이스이다. ▶ 이 들에 정의된 compare(), compareTo()를 구현함으로써 정렬이 필요한 경우, 예를 들면 TreeSet이나 sort()를 사용할 때, 정렬기준을 제시하게 된다. ▶ compare()와 compareTo()는 이름과 매개변수의 수만 다를 뿐, 두 객체를 비교해서 같으면 0을 작으면 음수, 크면 양수를 반환한다는 것은 같다. 그리고 이 반환값을 통해 두 객체의 정렬순서가 결정된다. ※ equals메서드는 모든 클래스가 가지고 있지만, Comparator를 구현하는 클래스는 equals메서드의 오버라이딩이 필요할 수도 있다는 것을 알리기 위해 정의한 것일 뿐, 대부분의 경우 compare(Object o1, Object o2)만 구현하면 된다. 28 28
1.19 Comparator와 Comparable – 구현예(examples) Java 의 정석 Chapter 11. 컬렉션 프레임웍(collection framework) http://www.javachobo.com 1.19 Comparator와 Comparable – 구현예(examples) 29 29
Java 1.20 Hashtable과 HashMap 정석 의 정석 Chapter 11. 컬렉션 프레임웍(collection framework) http://www.javachobo.com 1.20 Hashtable과 HashMap - HashMap은 Hashtable의 신버젼이며, Hashtable과 달리 HashMap은 동기화처리가 되어 있지 않다. 가능하면 Hashtable보다는 HashMap을 사용하자. - HashMap은 해싱(hashing)기법을 사용해서 데이터를 저장하기 때문에 많은 양의 데이터를 검색할 때 성능이 뛰어나다. - HashMap은 Map인터페이스를 구현하였으며, 데이터를 키와 값의 쌍으로 저장한다. 30 30
Java 1.21 HashMap - 주요메서드 정석 의 Chapter 11. 컬렉션 프레임웍(collection framework) http://www.javachobo.com 1.21 HashMap - 주요메서드 31 31
Java 1.22 해싱(hashing) – (1/2) 정석 의 정석 Chapter 11. 컬렉션 프레임웍(collection framework) http://www.javachobo.com 1.22 해싱(hashing) – (1/2) - 해시함수(hash function)를 이용해서 해시테이블(hash table)에 저장하고 검색하는 기법 - 해싱에 사용되는 자료구조는 배열과 링크드리스트가 조합된 형태이다. 32 32
Java 1.22 해싱(hashing) – (2/2) 정석 ▶ 키를 이용해서 해시테이블로부터 데이터를 가져오는 과정 의 정석 Chapter 11. 컬렉션 프레임웍(collection framework) http://www.javachobo.com 1.22 해싱(hashing) – (2/2) ▶ 키를 이용해서 해시테이블로부터 데이터를 가져오는 과정 ① 키를 이용해서 해시함수를 호출한다. ② 해시함수의 호출결과인 해시코드에 대응하는 배열에 저장된 링크드리스트를 찾는다. ③ 링크드리스트에서 키와 일치하는 데이터를 찾는다. ※ 해시함수는 같은 키값에 대해 항상 같은 해시코드를 반환해야한다. 서로 다른 키값일지라도 같은 값의 해시코드를 반환할 수 있다. 33 33
Java 1.23 TreeMap 정석 - 이진검색트리의 형태로 키와 값의 쌍으로 이루어진 데이터를 저장한다. Chapter 11. 컬렉션 프레임웍(collection framework) http://www.javachobo.com 1.23 TreeMap - 이진검색트리의 형태로 키와 값의 쌍으로 이루어진 데이터를 저장한다. - Map의 장점인 빠른 검색과 Tree의 장점인 정렬과 범위검색의 장점을 모두 갖고 있다. - 이진검색트리처럼, 데이터를 저장할 때 정렬하기 때문에 저장시간이 길다는 단점을 가지고 있다. - 정렬된 상태로 데이터를 조회하는 경우가 빈번하다면, 데이터를 조회할 때 정렬해야 하는 HashMap보다는 이미 정렬된 상태로 저장되어 있는 TreeMap이 빠른 조회결과를 얻을 수 있다. - 주로 HashMap을 사용하고, 정렬이나 범위검색이 필요한 경우에만 TreeMap을 사용하는 것이 좋다. 34 34
Java 1.23 TreeMap – 주요메서드 정석 의 Chapter 11. 컬렉션 프레임웍(collection framework) http://www.javachobo.com 1.23 TreeMap – 주요메서드 35 35
Java 의 정석 Chapter 11. 컬렉션 프레임웍(collection framework) http://www.javachobo.com 1.24 Properties - 내부적으로 Hashtable을 사용하며, key와 value를 (String, String) 로 저장 - 주로 어플리케이션의 환경설정에 관련된 속성을 저장하는데 사용되며 파일로부터 편리하게 값을 읽고 쓸 수 있는 메서드를 제공한다. 36 36
1.24 Properties – 예제(example) Java 의 정석 Chapter 11. 컬렉션 프레임웍(collection framework) http://www.javachobo.com 1.24 Properties – 예제(example) [output.txt] [output.xml] 37 37
Java 1.25 컬렉션 클래스 정리 & 요약 (1/2) 정석 의 Chapter 11. 컬렉션 프레임웍(collection framework) http://www.javachobo.com 1.25 컬렉션 클래스 정리 & 요약 (1/2) 38 38
Java 1.25 컬렉션 클래스 정리 & 요약 (2/2) 정석 의 Chapter 11. 컬렉션 프레임웍(collection framework) http://www.javachobo.com 1.25 컬렉션 클래스 정리 & 요약 (2/2) 39 39
감사합니다. http://www.javachobo.com Java 정석 의 정석 Chapter 11. 컬렉션 프레임웍(collection framework) http://www.javachobo.com 감사합니다. 더 많은 동영상강좌를 아래의 사이트에서 구하실 수 있습니다. http://www.javachobo.com 이것으로 제 7장 객체지향개념II-2에 대한 강의를 모두 마치겠습니다. 감사합니다. 이 동영상강좌는 비상업적 용도일 경우에 한해서 저자의 허가없이 배포하실 수 있습니다. 그러나 일부 무단전제 및 변경은 금지합니다. 관련문의 : 남궁성 castello@naver.com