읽은 책 정리/자바의정석 3판

[Java] Chapter11 컬렉션 프레임워크

포포015 2021. 3. 28. 23:58

1. 컬렉션 프레임워크

- 데이터(다수의 데이터를 저장하는) 표준화된 프로그래밍 방식

 다수의 데이터를 다루는데 필요한 다양하고, 풍부한 클래스를 제공

 또한 인터페이스와, 다형성을 이용한 객체 지향적 설계를 통해 표준화 되어있다.

 

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

- 각 데이터 그룹을 크게 3가지 타입이 존재한다고 인식하고, 3개의 인터페이스를 정의함.

그리고, 인터페이스 List와 Set의 공통된 부분을 뽑아 새로운 인터페이스 Collection 추가 정의.

  (Map은 List와 Set과 다른형태로 데이터를 다루기에 Collection 에 포함 X)

List - 순서 O , 중복 O

Set - 순서 X , 중복 X

Map - 키와 값의 쌍으로 이루어진 데이터 . 순서 X , 키중복 X 값 중복 O

 

 

List 인터페이스  - 중복 허용, 저장순서 유지

 

Set 인터페이스 - 중복 X, 저장순서 X

6

Map 인터페이스 - 키와 값을 하나의 쌍으로 묶어서 저장. 키 중복X, 값중복 O

                           (중복된 키를 저장하면 기존의값은 날라감)

60

 

1.2 ArrayList

- 컬렉션 프레임워크에서 가장 많이 사용

List 인터페이스를 구현하기때문에 데이터 저장순서 O, 중복 O

배열에 더이상 저장할 공간이 없으면 보다 큰 새로운 배열을 생성해서

기존의 배열에 저장된 내용을 새로운 배열로 복사한 다음저장

(용량을 변경해야할때는 새로운 배열을 생성한후에 기존의 배열로부터 새로 생성된 배열로 데이터를

복사해야되기떄문에 효율 X)

 

1.3 LinkedList

- 가장 기본적인 자료구조, 간단하며 사용하기 쉽고 데이터를 읽어오는데 걸리는 시간이 가장빠름.

단점 1) 크기변경 X

       2) 비순차적인 데이터의 추가 또는 삭제에 시간이 많이 걸린다.

- 링크드 리스트는, 이동방향이 단방향이기때문에 다음 요소에 접근은 쉽지만, 이전요소에 대한 접근은 어려움.

 이점을 보완한것이 더블링크드 리스트(이중연결리스트) - 이전요소(주소값)까지 보유

 

결론 1. 순차적으로 추가/삭제하는 경우 ArrayList가 LinkedList보다 빠르다.

       2. 중간에 데이터를 추가/삭제하는경우 LinkedList가 ArrayList보다 빠르다

 

1.4 Stack과 Queue

스택 - 마지막에 저장한 데이터를 가장먼저 꺼내게 되는 LIFO(Last in First Out) 구조큐 - 처음에 저장한 데이터를 가장먼저 꺼내게 되는 FIFO(Fisrt in First Out) 구조

 

자바에서는 스택을 statck 클래스로 정의해두고 , 큐는 Queue 인터페이스로 만 정의 해놓았을뿐별도의 클래스를 제공하지 않는다. 구현한 클래스를 선택해 사용하자. 자바API 문서에 정의되어 있음.(LinkedList 사용O)

 

스택과 큐의 활용

스택 - 수식계산, 수식괄호 검사, 워드프로세서의 undo/redo , 웹브라우저의 뒤로,앞으로

큐 - 최근사용문서, 인쇄작업 대기목록 ,버퍼 등...

 

1.5 lterator, Listlterator, Enumeration

- 컬렉션에 정의된 인터페이스는 데이터를 저장하는방법이 각자 다른데, 컬렉션에 저장된 요소를 접근하는데 사용되는 인터페이스이다.

 

lterator

- 컬렉션에 저장된 요소들을 읽어오는 방법을 표준화

( Map 인터페이스를 구현한 컬렉션 클래스는 키와 값으로 저장되있기때문에, 일반적인 List와 set처럼 lterator를 사용X

그대신 keyset(), entryset()과 같은 메서드를 통해 키와 값을 각각 얻어서 lterator 를 호출 해야한다.

1
2
3
4
5
6
Collection c = new ArrayList(); //객체생성
Iterator it = c.iterator();
 
while(it.hasNext()){
    System.out.println(it.next());
}
cs

 

Listlteraot와 Enumeration

 Enumeration - lterator의 구버전

 Listlterator - lterator에 양방향 조회기능(List를 구현한경우만 사용가능)

 

1.6 Arrays

- 배열을 다루는데 유용한 메서드 정의

1) copyOf(), copyOfRange()  -배열복사

2) fill(), setfill()  - 배열채우기

3) sort(), binarySearch() - 배열의 정렬과 검색

4) equals(), toString() -배열의 비교와 출력 (toString은 1차원 배열에만 사용가능

                                                        다차원 배열은 deeptoString 사용)

 

1.7 Comparator와 Comparable

Array.sort하면 정렬이 되는데, 사실 Charactor 클래스의 Comparable의 구현에 의해 정렬이 된거란다...

(그냥 이런게 있다.. 정도만 보고 넘어가자)

 

1.8 HashSet

- Set 인터페이스를 구현한 대표적인 컬렉션 (HashSet은 중복된 요소 저장X)

- Set의 기본 클래스는 저장순서를 유지하지 않으나, 저장순서를 유지하고 싶다면 LinkedHashSet을 사용하자.

 

1.9 TreeSet

-  이진 검색트리 라는 자료구조의 형태로 데이터 저장

 (정렬,검색,범위검색)에 높은 성능을 보이는 자료구조 ( 중복X, 순서 X)

 이진 검색트리는 부모노드의 왼쪽에는, 부모노드의 값보다 작은 값이, 오른쪽에는 부모노드보다 큰값이 저장

 !! 검색(범위검색)과 정렬에 유리하다

 

1.10 HashMap과 HashTable

- HashMap은 Map을 구현했으므로, 키(key)와 값(value)를 묶어서 하나의 데이터로 저장하는 특징.

 *해싱과 해시함수

 - 해싱이란 해시함수(hash fuction)를 이용해서 데이터를 해시테이블(hash table)에 저장하고 검색하는기법

해시함수는 데이터가 저장되어 있는곳을 알려주기때문에, 다량의 데이터중에서 원하는 데이터를 빠르게 찾을수있다.

 

1.11 TreeMap

- 이진검색트리의 형태로, 키와 값의 쌍으로 이루어진 데이터를 저장한다(검색과 정렬에 적합)

 

1.12 Properties

- HashMap의 구버전인 HashTable을 상속받아 구현한것으로 , HashTable은 키와 값의 형태로 저장하는반면,

 Properties는 (String , String)의 형태로 저장하는 보다 단순화된 컬렉션 클래스이다.

( 주로 앱 환경 설정과 관련된 속성을 저장하는데 사용됨)

 

1.13 Collections

- 컬렉션과 관련된 메서드 제공(보통 쓰레디 사용에 사용함).