본문 바로가기

Languages/JAVA

컬렉션 프레임웍

컬렉션 프레임웍

 : '데이터 군을 저장하는 클래스들을 표준화한 설계'를 뜻한다.

  컬렉션, 다수의 데이터를 다루는데 필요한 다양하고 풍부한 클래스들을 제공하기 때문에 프로그래머의 짐을 상당히 덜어 주고 있으며, 또한 인터페이스와 다형성을 이용한 객체지향적 설계를 통해 표준화되어 있기 때문에 사용법을 익히기에도 편리하고 재사용성이 높은 코드를 작성할 수 있다는 장점이 있다.

 

핵심 인터페이스

 : 3가지 타입이 존재한다.

인터페이스간의 상소계층도

List : 순서가 있는 데이터의 집합. 데이터의 중복을 허용.
       예) 대기자 명단
   구현클래스 : ArrayList, LinkedList, Stack, Vector 등
Set : 순서를 유지하지 않는 데이터의 집합. 데이터의 중복을 허용하지 않는다.
       예) 양의 정수 집합, 소수의 집합
   구현클래스 : HashSet, TreeSet 등
Map : 키와 값의 쌍으로 이루어진 데이터의 집합.
        순서는 유지되지 않으며, 키는 중복을 허용하지 않고, 값은 중복을 허용한다.
        예) 우편번호, 지역번호
   구현클래스 : HashMap, TreeMap, Hshtable, Properties 등

 

List의 상속계층도
Set의 상속계층도

 

Map의 상속계층도

ArrayList

 : 기존의 Vector를 개선한 것으로 Vector와 구현원리와 기능적인 측면에서 동일하다고 할 수 있다.

   

 추가와 삭제

1. 삭제할 데이터의 아래에 있는 데이터를 한 칸씩 위로 복사해서 삭제할 데이터를 덮어쓴다.
2. 데이터가 모두 한 칸씩 위로 이동하였으므로 마지막 데이터는 null로 변경
3. 데이터가 삭제되어 데이터의 개수(size)가 줄었으므로 size의 값을 1 감소시킨다.

 배열은 가장 기본적인 형태의 자료구조로 구조가 간단하며 사용하기 쉽고 데이터를 읽어 오는데 걸리는 시간(접근시간, access time)이 가장 빠르다는 장점.

단점
 1. 크기를 변경할 수 없다.
   - 새로운 배열을 생성해서 데이터를 복사해야함.
   - 실행 속도를 향상시키기 위해서는 충분히 큰 크기의 배열을 생성해야 하므로 메모리 낭비.
 2. 비순차적인 데이터의 추가 또는 삭제에 시간이 많이 걸린다.
   - 차례대로 데이터를 추가하고 마지막에서부터 데이터를 삭제하는 것이 빠르지만,
   - 배열의 중간에 데이터를 추가하려면, 빈자리를 만들기 위해 다른 데이터들을 복사해서 이동해야 한다. 

LinkedList

 : 단점을 보안하기 위해 LinkedList라는 자료구조가 고안되었다.

 

배열은 한 주소에 값들이 들어있다면, LinkedList는 리스트의 각 요소들은 자신과 연결된 다음 요소에 대한

참조(주소값)와 데이터로 구성되어 있다.

 

 추가와 삭제

  : 삭제하고자 하는 요소의 이전 요소가 삭제하고자 하는 요소의 다음 요소를 참조하도록 변경하면 된다.

   새로운 요소를 생성한 다음 추가하고자 하는 위치의 이전 요소의 참조를 새로운 요소에 대한

   참조로 변경해주고, 새로운 요소가 그 다음 요소를 참조하도록 변경하기만 하면 된다.

   처리 속도가 빠르다.

 

Stack과 Queue

 스택은 마지막에 저장한 데이터를 가장 먼저 꺼내게 되는 LIFO(Last In First Out) 구조.

 큐는 처음에 저장한 데이터를 가장 먼저 꺼내게 되는 FIFO(First In First Out) 구조.

 

 스택은 클래스로 구현하여 제공하고 있지만 큐는 인터페이스로만 정의해 놓았을 뿐 별도의 클래스를

 제공하고 있지 않다. 그래서 구현한 클래스들 중 하나를 선택해서 사용하면 된다.

 

인터페이스 구현 클래스 찾기

 : Java API 문서를 참고하면 된다.

활용

스택 예) 수식계산, 수식괄호검사, 워드프로세서의 undo/redo, 웹브라우저의 뒤로/앞으로
큐 예) 최근사용한문서, 인쇄작업 대기목록, 버퍼

 

Iterator, ListIterator, Enumeration

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

Iterator : 컬렉션에 저장된 요소를 접근하는데 사용되는 인터페이스
ListIterator : Iterator에 양방향 조회기능추가(List를 구현한 경우만 사용가능)
Enumeration : Iterator의 구버전

Iterator 사용법

 List클래스들은 Iterator 대신 for문과 get()를 이용하여 모든 요소들을 출력할 수 있다.

 

Map과 Iterator

 : Map은 key와 value를 쌍으로 저장하고 있기 때문에 iterator()를 직접 호출할 수 없고,

   대신 keySet()이나 entrySet()과 같은 메서드를 통해서 key와 value를 각각 따로 set의 형태로

   얻어 온 후에 다시 iterator()를 호출해야한다.

 

Arrays클래스

복사
 : copyOf()는 배열전체
   copyOfRange()는 배열의 일부를 복사해서 새로운 배열을 만들어 반환.
채우기
 : fill()은 배열의 모든 요소를 지정된 값으로 채운다.
   setAll()은 배열을 채우는데 사용할 함수형 인터페이스를 매개변수로 받는다.
정렬과 검색
 : sort()는 배열을 정렬할 때
   binarySearch()는 배열에 저장된 요소를 검색할 때, 반드시 배열이 정렬된 상태이어야 올바른 결과를 얻는다.
비교와 출력
 : toString() 으로 배열의 모든 유소를 문자열로 편하게 출력, 일차원 배열에만 사용.
   다차원 배열에는 deepToString()사용
   equals() 두 배열에 저장된 모든 요소를 비교.
   다차원 배열의 비교에는 deepEquals() 사용.
변환
 : asList() 배열을 List에 담아서 반환한다.
  asList가 반환한 List의 크기는 변경할 수 없다.

sort(), binarySearch()

 

Comparator와 Comparable

 : 인터페이스, 컬렉션을 정렬하는데 필요한 메서드를 정의하고 있다.

 

HashSet

 : Set인터페이스를 구현한 가장 대표적인 컬렉션, 중복요소를 저장하지 않는다.

   false를 반환함으로써 중복된 요소가 있음을 알려준다.

   저장순서를 유지하고 싶으면 LinkedHashSet을 사용하면 된다.

 

TreeSet

 : 이진 탐색 트리(binary search tree)라는 자료구조의 형태로 데이터를 저장하는 컬렉션 클래스.

이진 트리의 예

이진 탐색 트리

- 모든 노드는 최대 두 개의 자식노드를 가질 수 있다.
- 왼쪽 자식노드의 값은 부모노드의 값보다 작고 오른쪽 자식노드의 값은 부모노드의 값보다 커야한다.
- 노드의 추가, 삭제에 시간이 걸린다. (순차적으로 저장하지 않으므로)
- 검색(범위검색)과 정렬에 유리하다.
- 중복된 값을 저장하지 못한다.

이진 탐색 트리의 저장과정

첫 번째로 저장되는 값은 루트가 되고, 두 번째 값은 트리의 루트부터 시작해서 값의 크기를 비교하면서

트리를 따라 내려간다.

 

HashMap

 : 키와 값을 각각 Object타입으로 저장한다. 어떠한 객체도 저장할 수 있지만 키는 주로 String을 대문자

   또는 소문자로 통일해서 사용한다. 

 Key - 컬렉션 내의 키 중에서 유일해야 한다.

 Value - 데이터의 중복 허용.

 

Collections 클래스

동기화

 : Vector와 Hashtable과 같은 구버전(JDK1.2이전)의 클래스들은 자체적으로 동기화

  처리가 되어있는데,  새로 추가된 ArrayList와 HashMap과 같은 컬렉션은 동기화를 자체적으로

  처리하지 않고 필요한 경우에만 java.util.Collections클래스의 동기화 메서드를 이용해서 동기화처리가

  가능하도록 변경됨.

   synchronizedList(List list)

 

변경불가

 : 컬렉션에 저장된 데이터를 보호하기 위해서 컬렉션을 변경할 수 없게, 즉 읽기전용으로 만들 때.

   unmodifiableList(List list)

 

싱글톤

 : 단 하나의 객체만을 저장하는 컬렉션을 만들어야 하는 경우.

   singletonList(Object o)

 

단일 컬렉션

 : 컬렉션에 지정된 종류의 객체만 저장할 수 있도록 제한하고 싶을 때.

   checkedList(List list, Class type)

 

정리 & 요약

'Languages > JAVA' 카테고리의 다른 글

열거형(enum), 어노테이션  (0) 2020.04.08
Java 제네릭스(Generics)  (0) 2020.04.08
java.lang 클래스  (0) 2020.04.02
예외처리  (0) 2020.03.31
객체 지향 프로그래밍이란?  (0) 2020.03.23