본문 바로가기

프로그래밍/Java

[Java 요약 정리] 5. 컬렉션 프레임워크(Collections Framework)

5. 컬렉션 프레임워크(Collections Framework)

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

- 프레임워크: 표준화 정형화된 체계적인 프로그래밍 방식

- 컬렉션 프레임워크: 컬렉션을 다루기 위한 표준화된 프로그래밍 방식(java.util 패키지에 포함)

- 컬렉션 클래스: 다수의 데이터를 저장할 수 있는 클래스


1) 컬렉션 프레임워크의 핵심 인터페이스

- List: 순서가 있는 데이터의 집합(중복 허용)

*ArrayList, LinkedList, Stack, Vector 등

- Set: 순서를 유지하지 않는 데이터의 집합(중복 불허)

*HashSet, TreeSet 등

- Map: 키와 값의 쌍으로 이루어진 데이터의 집합(키 중복 허용, 값 중복 불허, 순서미유지)

*HashMap, TreeMap, Hashtable, Properties 등


2) Vector와 ArrayList

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

- ArrayList와 달리 Vector는 자체 동기화 처리

- List 인터페이스를 구현하므로 저장 순서 유지 및 중복 허용

- 배열 기반


3) ArrayList

- 데이터 삭제시 삭제할 데이터 아래의 데이터를 복사해서 덮어쓴 후 size 축소

- 장점: 구조가 간단하고 데이터 접근시간이 짧음

- 단점: 크기 변경 불가(배열 생성 후 복사해야 함), 비순차적인 데이터 추가삭제에 시간 낭비


4) Vector

- 크기: 저장된 객체의 개수

- 용량: 배열의 길이


5) LinkedList

- 배열의 단점을 보완(불연속적 데이터를 연결)

- 데이터 삭제: 참조변경 1회

- 데이터 추가: 객체생성 1회, 참조변경 2회

- 단점: 접근성이 떨어짐

- 더블리 링크드 리스트(doubly linked list): 이중 연결 리스트, 접근성 향상

- 더블리 써큘러 링크드 리스트(doubly circular linked list): 이중 원형 연결리스트


6) 그 외

- 덱(Deque): Stack과 Queue의 결합, 양끝에서 저장(offer) 삭제(poll) 가능

- 우선순위 큐(Priority Queue): 우선순위가 높은 것 부터 꺼냄(null 저장 불가)

- 블락킹 큐(Blocking Queue): 지연(block) 기능(비어있을 때 꺼내기, 가득차 있을 때 넣기)


7) Enumeration, Iterator, ListIterator

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

- Iterator:1회성(재사용 불가), 읽는 도중 변경 불가

- ListIterator: Iterator의 접근성 향상(단방향 -> 양방향)

- boolean hasNext(): 읽어올 요소가 남아있는지 확인(있으면 true)

- Object next(): 다음 요소를 읽어온다(hasNext로 확인하는게 안전)

- void remove(); next()로 읽어온 요소 삭제


8) Arrays

- 배열에 관한 메소드 제공

- toString(): 배열 출력

- deepEquals(), deepToString(): 다차원 배열의 비교와 출력

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

- fill(), setAll(): 배열 채우기(람다식)

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

- sort(), binarySearch(): 배열의 정렬과 검색(정렬시에만 사용 가능)


9) Comparator와 Comparable

- 객체 정렬 메소드를 정의한 인터페이스(정렬 기준 제공)

- Comparable: 기본 정렬 기준 구현

- Comparator: 기본 정렬 기준 외 다른 기준으로 정렬시 사용

- compare(), compareTo(): 두 객체의 비교 결과를 반환하도록 작성(=:0 <:- >:+)


10) HashSet

- HashSet: Set인터페이스를 구현(순서를 유지하려면 LinkedHashSet클래스 사용)

- 중복 불허(객체 저장 전 같은 객체가 있는지 확인)

- add(), addAll(): 요소 추가(중복시 false 반환)// equals(), hashCode() 오버라이딩 필수

- hashCode() 오버라이딩 조건: 동일 객체 동일 값 반환, equals true=> 코드값도 동일


11) TreeSet

- 범위 검색과 정렬에 유리한 이진 탐색 트리 구현

- LinkedList와 같이 각 노드가 나무 형태로 연결된 구조

- 모든 노드가 최대 두개의 하위 노드를 가짐

- 이진트리와 달리 이진 탐색 트리는 부모보다 작은값 왼쪽, 큰 값 오른쪽에 저장

- 트리 순회: 이진트리의 모든 노드를 한번씩 읽는 것(전위, 중위, 후위)


12) HashMap

- 해싱 기법으로 데이터 저장(데이터가 많아도 검색이 빠름)

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

- key: 컬렉션 내의 키 중 유일해야 함

- value: 중복 허용


13) TreeMap

- 이진 검색 트리구조로 키와 값의 쌍으로 이루어진 데이터 저장

- 데이터를 정렬해서 저장하기 때문에 저장시간이 길다

- 다수의 데이터에서 개별적인 검색은 HashMap이 더 빠름

- 정렬이나 범위검색이 필요한 경우 TreeMap 사용


14) properties

- 내부적으로 Hashtable을 사용하며 key와 value를 (String, String)로 저장

- 환경설정 관련 속성 저장에 사용


15) Collections

- 컬렉션을 위한 static 메소드 제공

- synchronizedXXX(): 컬렉션의 동기화

- unmodifiableXXX(): 변경불가(readOnly) 컬렉션

- singletonXXX(): 1개만 저장가능한 컬렉션

- checkedXXX(): 한종류 객체 저장 컬렉션