Chapter11 컬렉션 프레임웍 Collections Framework

Chapter11 컬렉션 프레임웍 Collections Framework

Chapter11 컬렉션 프레임웍 Collections Framework

1. 컬렉션 프레임웍(Collections Framework)

컬렉션(collection) : 여러 객체(데이터)를 모아 놓은 것을 의미

프레임웍(framework) : 표준화, 정형화된 체계적인 프로그래밍 방식, 작업 생산성 증가, 유지 보수 증가.

라이브러리(library) : 다른 사람들이 만들어 놓은 기능들을 모아둔 것.

컬렉션 프레임웍(collection framework) : 다수의 객체를 다루기 위한 표준화된 프로그래밍 방식, 다양한 클래스를 제공( java.util 패키지에 포함)

패키지에 포함) 컬렉션 클래스(collection class) : 다수의 데이터를 저장할 수 있는 클래스

1.1 컬렉션 프렘웍의 핵심 인터페이스

List : 순서가 있는 데이터 집합, 중복을 허용. Set : 순서를 유지하지 않는 데이터의 집합, 중복을 허용하지 않음. Map : 키(key)와 값(value)의 쌍(pair)으로 이루어진 데이터의 집합. 순서x, 키는 중복x, value는 중복 허용.

1.1.1 Collection인터페이스

추가, 삭제, 검색으로 구성

1.1.2 List 인터페이스 - 순서o, 중복o

1.1.3 Set 인터페이스 - 순서x, 중복x

집합과 관련된 메서드( Collection이 변화가 있으면 true 아니면 false를 반환한다.)

1.1.4 Map 인터페이스 - 순서x, 중복(키 : x, 값 : o)

Map.Entry 인터페이스

Map 인터페이스의 내부 인터페이스, Map인터페이스를 구현하는 클래스에서는 Map.Entry인터페이스도 함께 구현해야한다.

1.2 Array List

기존의 Vector를 개선한 것으로 구현원리와 기능적으로 동일

Arraylist는 동기화처리가 되어 있지 않다.(Vector와 반대)

저장순서가 유지, 중복 허용

데이터의 저장 공간으로 배열을 사용한다.

1.2.1 메서드

생성자

추가

삭제

remove(2) : 인덱스가 2인 곳을 삭제

remove(new Integer(2)) : 숫자 2를 삭제

끝에 부터 지워야지 성능도 향상되고, 데이터가 남지 않는다.

검색

기타

1.3 LinkedList

배열의 단점을 보완 → 변경에 유리하게 바꿈

불연속적으로 존재하는 데이터를 Node를 사용하여 연결(link)

Node에는 다음노드의 주소와 데이터가 포함되어 있다.

데이터 접근성이 나쁨. → 링크드 리스트(doubly linked list) : 이중 연결리스트, 접근성 향상(이전과 다음요소의 주소를 가지고 있음) → 더블 써큘러 링크드 리스트(doubly circular linked list) : 이중 원형 연결리스트, 맨 처음과 맨 끝을 연결 함.

1.3.1 배열의 장단점

장점 : 구조가 간단하고, 접근시간이 짧다.

단점 크기를 변경할 수 없다. 비순차적인 데이터의 추가 또는 삭제에 시간이 많이 걸린다.

1.3.2 ArrayList vs LinkedList

성능비교

1. 순차적으로 데이터 추가/삭제 - ArrayList 가 빠름

2. 비순차적으로 데이터 추가/삭제 - LinkedList 가 빠름

3. 접근시간 - ArrayList 가 빠름

1.4 Stack 과 Queue

스택( Stack ) : LIFO구조(밑이 막힌 상자), 클래스로 정의, 마지막에 저장( push )된 것을 제일 먼저 꺼내게( pop ) 된다. → 배열로 구현하는게 좋다.

) : LIFO구조(밑이 막힌 상자), 클래스로 정의, 마지막에 저장( )된 것을 제일 먼저 꺼내게( ) 된다. → 배열로 구현하는게 좋다. 큐( Queue ) : FIFO구조(밑이 뚫린 상자), 인터페이스로 정의되어 있음, 제일 먼저 저장( offer )한 것을 제일 먼저 꺼내게( poll ) 된다. → 링크드 리스트로 구현하는게 좋다.

1.4.1 스택과 큐의 메서드

1.4.2 스택과 큐의 활용

스택의 활용 예 : 수식계산, 수식괄호검사, 워드의 udno/redo, 웹브라우저의 뒤로, 아픙로

큐의 활용 예 : 최근사용문서, 인쇄작업 대기 목록, 버퍼(buffer)

1.4.3 Priority Queue

Queue 인터페이스의 구현체 중의 하나로, 저장한 순서와는 관계없이 우선순위(priority)가 높은 것부터 꺼내게 된다.

인터페이스의 구현체 중의 하나로, 저장한 순서와는 관계없이 우선순위(priority)가 높은 것부터 꺼내게 된다. null은 저장할 수 없다.

힙(heap)이라는 자료구조의 형태로 저장.

우선순위 : 숫자가 작은 것

1.4.4 Deque(Double-Ended Queue)

양쪽 끝에 추가/삭제가 가능한 것.

1.5 Iterator , ListIterator , Enumeration

컬렉션에 저장된 데이터를 접근하는데 사용되는 인터페이스

Enumeration 은 Iterator 의 구버전

은 의 구버전 ListIterator 는 Iterator 의 접근성을 향상시킨 것(단방향 → 양방향)

1.5.1 Iterator

컬렉션에서 iterator() 를 호출해서 Iterator 를 구현한 객체를 얻어서 사용.

를 호출해서 를 구현한 객체를 얻어서 사용. 1회용이라 다쓰고나면 다시 얻어와야 함.

List list = new ArrayList(); Iterator it = list.iterator(); while(it.hasNext()) { System.out.println(it.next()); }

1.5.2 Map 과 Iterator

Map 에는 iterator() 가 없다.

에는 가 없다. keySet() , entrySet() , values() 호출

1.5.3 ListIterator 와 Enumeration

Enumeration 은 Iterator 의 구버전

은 의 구버전 ListIterator : Iterator 에 양방향 조회기능추가( List 를 구현한 경우만 사용가능)

Enumeration의 메서드

ListIterator의 메서드

1.6 Arrays

배열을 다루기 편리한 메서드(static) 제공.

배열의 출력 - toString()

배열의 복사 - copyOf() , copyOfRange() (새로운 배열을 생성해서 반환)

배열 채우기 - fill() , setAll()

배열의 정렬과 검색 - sort() , binarySearch() (정렬을 한 상태에서 binarySearch()를 써야한다.)

다차원 배열의 출력 - deepToString()

다차원 배열의 비교 - deepEquals()

배열을 List로 변환 - asList(Object... a)

→ list는 읽기 전용이므로 값을 변경하려면 new ArrayList()붙혀서 새로운 리스트를 만들어야 한다. 람다와 스트림(14장) 관련 - parallelXXX() , spliterator() , stream()

1.7 Comparator 와 Comparable

객체 정렬에 필요한 메서드(정렬기준 제공)를 정의한 인터페이스(정렬할 때 정렬대상과 정렬기준이 필요하다.)

static void sort(Object[] a) // 객체 배열에 저장된 객체가 구현한 Comparable에 의한 정렬 static void sort(Object[] a, Comparator c) // 지정한 Comparator에 의한 정렬

Comparable : 기본(default) 정렬기준을 구현하는데 사용. → 자기자신과 비교

: 기본(default) 정렬기준을 구현하는데 사용. → 자기자신과 비교 Comparator : 기본 정렬기준 외에 다른 기준으로 정렬하고자할 때 사용. → 0이면 같음, 음수면 오른쪽이 큼, 양수면 왼쪽이 큼.

1.8 HashSet - 순서x, 중복x

Set 인터페이스를 구현한 대표적인 컬렉션 클래스

인터페이스를 구현한 대표적인 컬렉션 클래스 순서를 유지하려면, LinkedHashSet 클래스를 사용하면 된다.

클래스를 사용하면 된다. 객체를 저장하기전에 기존에 같은 객체가 있는지 확인( equals() , hashcode() 이용)해야 한다.(없으면 저장)

cf) TreeSet : 범위 검색과 정렬에 유리한 컬렉션 클래스, HashSet 보다 데이터 추가 삭제가 오래 걸림.( compare() 이용)

<주요 메서드>

1.9 TreeSet - 범위 탐색, 정렬

이진 탐색 트리(binary search tree)로 구현, 범위 탐색과 정렬에 유리.

이진 트리는 모든 노드가 최대 2개의 하위 노드를 갖음.

각 요소(node)가 나무(tree)형태로 연결(LinkedList의 변형)

객체가 정렬기준을 가지고 있거나 정렬기준을 TreeSet(정렬기준)을 해줘야 한다.

class TreeNode { TreeNode left; // 왼쪽 자식노드 Object element; // 객체를 저장하기 위한 참조변수 TreeNode right; // 오른쪽 자식노드 }

1.9.1 이진 탐색 트리(binary search tree)

부모보다 작은 값은 왼쪽, 큰 값은 오른쪽에 저장

데이터가 많아질 수록 추가, 삭제에 시간이 더 걸림(비교 횟수가 증가하기 때문)

1.9.2 주요 생성자와 메서드

)

1.9.3 트리 순회(tree traversal)

이진 트리의 모든 노드를 한번씩 읽는 것을 트리 순회라고 한다.

트리 순회에는 전위, 중위, 후위, 레벨 순회가 있다.

중위 순회하면 오름차순으로 정렬된다.

1.10 HashMap 과 Hashtable - 순서x, 중복(키x, 값o)

Map 인터페이스를 구현. 테이터를 키와 값의 쌍으로 저장

인터페이스를 구현. 테이터를 키와 값의 쌍으로 저장 HashMap (동기화x)은 Hashtable (동기화o)의 신버전

1.10.1 HashMap

Map 인터페이스를 구현한 대표적인 컬렉션 클래스

인터페이스를 구현한 대표적인 컬렉션 클래스 순서를 유지하려면, LinkedHashMap 클래스를 사용하면 된다.

1.10.2 TreeMap

범위 검색과 정렬에 유리한 컬렉션 클래스

HashMap 보다 데이터 추가, 삭제에 시간이 더 걸림

1.10.3 HashMap 의 키( key )와 값( value )

해싱(hashing)기법으로 데이터를 저장. 데이터가 많아도 검색이 빠르다.

Map 인터페이스를 구현. 데이터를 키와 값의 쌍으로 저장

Entry[] table; // 객체 지향적 코드 class Entry { Object key; Object value; }

키(key) : 컬렉션 내의 키(key) 중에서 유일해야 한다.

: 컬렉션 내의 키(key) 중에서 유일해야 한다. 값(value) : 키(key)와 달리 데이터의 중복을 허용한다.

해싱(hashing) 해시함수(Hash function)로 해시테이블(hash table)에 데이터를 저장, 검색

해시테이블은 배열(접근성↑)과 링크드 리스트(변경 유리)가 조합된 형태

해시테이블에서 저장된 데이터를 가져오는 과정 키로 해시함수를 호출해서 해시코드(배열의 인덱스)를 얻는다. 해시코드(해시함수의 반환값)에 대응하는 링크드리스트를 배열에서 찾는다. 링크드리스트에서 키와 일치하는 데이터를 찾는다.

해시함수는 같은 키에 대해서 항상 같은 해시코드를 반환해야 하고, 서로 다른 키일지라도 같은 값의 해시코드를 반활할 수도 있다.

1.10.4 주요 생성자와 메서드

1.11 TreeMap

이진검색트리의 형태로 키와 값의 쌍으로 이루어진 데이터를 저장한다.

검색과 저장에 적합한 컬렉션 클래스

검색은 HashMap 이 범위 검색과 정렬은 TreeMap 이 성능이 더 좋다.

1.12 Properties

HashMap 의 구버전인 Hashtable 을 상속받아 구현한 것으로, Properties 는 ( String , String )형태로 데이터를 저장한다.

1.13 Collections

컬렉션을 위한 메서드(static)을 제공 컬렉션 채우기, 복사, 정렬, 검색 - fill() , copy() , sort() , binarySearch() 등 컬렉션의 동기화 - synchronizedXXX() 변경불가(readOnly) 컬렉션 만들기 - unmodifiableXXX() 싱글톤 컬렉션 만들기 - singletonXXX() (객체 1개만 저장) 한 종류의 객체만 저장하는 컬렉션 만들기 - checkedXXX()

from http://kookiencream.tistory.com/28 by ccl(A) rewrite - 2021-08-28 09:26:13