자바 컬렉션 프레임워크(Collection FrameWork)
컬렉션(Collection)
정의 : '데이터 군(群 무리 군)을 저장하는 Vector와 같은 클래스들을 표준화한 설계'를 뜻한다.
컬렉션(Collection)은 다수의 데이터, 즉 데이터 그룹
프레임웍(FrameWork)은 표준화된 프로그래밍 방식을 의미
특징 :
1) 컬렉션은 제네릭(generics , "<>" , 임시적인 자료형) 기법으로 구현
2) 컬렉션의 요소는 객체만 사용 가능
3)<E> , <K> , <V> 타입 매개 변수
4) 하나의 컬렉션에 서로 다른 데이터형도 저장 가능함
5) 참조형 데이터만 저장 가능함
6) 컬렉션의 크기는 size() 메소드를 사용하여 구함
7) 인터페이스내에 add , remove , size 같은 데이터 저장 및 관리와 관련된 추상 메소드가 선언되어 있음
자료구조
Queue : FIFO(First In First Out : 선입선출) 먼저들어간것부터 먼저 나온다.
Stack : LIFO(Last In First Out: 후입선출) 마지막에들어간게 먼저 나온다.
Set 계열의 특징
1) 데이터가 중복 저장이 불가능하고 저장 순서가 없음
2) HashSet 과 TreeSet 같은 클래스를 이용함
3) SortedSet 인터페이스
List 계열의 특징
1) 데이터가중복저장이 가능하고 저장 순서가 있음
2) Vecter(synchronized 동기화) , ArrayList , LinkedList , Stack 중 ArrayList 클래스를 주로 많이 사용
3) Vecter와 ArrayList
Object배열을 이용해 데이터를 순차적으로 저장, 저장가능한 배열 공간이 없는경우 보다
큰 배열을 생성해 새로운 배열로 복사한 다음 저장
-공통점 : List인터페이스로 구성 , 저장순서가 순서가있고 , 데이터중복저장 가능 , 데이터의 저장 공간으로 배열을 사용
-차이점 : Vector는 멀티쓰레드에 대한 동기화가 되어있지만 , ArrayList는 그렇지 않음
Map 계열의 특징
1) key/value 쌍으로 저장하고 이후 key 를 이용하여 value 을 얻는 방법으로 구현
2) 순서는 유지되지 않으며 , 키는 중복을 허용하지 않고 , 값은 중복을 허용
3) HashMap , Hashtable , TreeMap , Properties 클래스를 이용함
4) Hashtable 하위클래스로 properties 클래스가 제공됨
5) Map 에서 지정된 객체를 반환할때 Value() 와 KeySet() 을 사용하는데
둘에 차이는 Value()에 경우 value는 중복을 허용하기 때문에 Collection타입으로 리턴하고 ,
KeySet()경우는 key는 중복을 허용하지 않기때문에 Set타입으로 리턴한다.
6)Map.Entry인터페이스 - Map인터페이스의 내부 인터페이스
key와 value쌍을 다루기 위해 내부적으로 정의 , Map인터페이스로 구성된 클래스는 Map.Entry인터페이스도 함께 구성해야함
동기화(Synchronization)
멀티쓰레드 프로그래밍에서 하나의 객체에 여러 쓰레드가 동시접근할때 데이터의 일관성을 유지하기 위해 동기화가 필요
-Vector 와 Hashtable 같은경우 자체적으로 동기화 처리가 되어있어 멀티쓰레드 프로그래밍이 아닌경우 불필요해 성능 저하 요인이됨
-JDK1.2이후 새로 추가된 ArrayList , HashMap 같은 경우는 자체적으로 동기화 처리하지않고 , 필요한 경우에만 Collections 클래스의
동기화 메서드를 이용해 동기화처리가 가능하도록 변경됨.
*java.util.Collection 은 인터페이스 , java.util.Collections는 클래스 이다.
컬렉션 프레임웍은 모든 컬렉션 클래스들이 List , Set , Map 중의 하나로 구현하고 있어 구현한 인터페이스의 이름의 특징을 쉽게 파악할수 있다 . 하지만 Vector , Stack , Hashtable , Properties와 같은 클래스들은 컬렉션 프레임웍이 만들어지기 전부터 존재하던 것이기 때문에 명명법을 따르지 않는다 .
성능 의 관점은 3가지 정도로 나눠진다.
- 저장 시간(insert time)
- 검색 시간(seek time)
- 읽는 시간(read time)
각 컬렉션 클래스들은 위의 관점에 대해서 장단점을 가진다.
Hash계열(HashMap , Hashtable )이 검색에서는 제일 빠르지만 , 대신 저장시간은 제일 오래건린다.
(전화번호부 와 같이 검색이 중요한 곳에서는 유리하고 , 증권시스템같이 동시에 만은 수의 데이터를 처리해야하는 경우에는 불리)
TreeMap과 같은 Sorted 계열은 저장시간은 Hash계열보다 빠르고 , 검색시간은 Hash계열보다 조금 느린 저장과 검색에 균형잡힌 성능을 제공한다.
TreeMap은 정렬된 상태로 데이터를 저장하기 때문에 , 범위검색(Range Search)기능을 제공한다.
검색없이 데이터를 저장하고 , 읽어오는 거라면 Vector와 ArrayList가 좋다.
더 최적화가 필요하다면 원초적인 Object배열을 직접 만들어서 구현해야한다 그러나 Vector와 ArrayList는 이미 최적화 되어 있기 때문에 성능이 매우 좋다.
읽는 시간은 큰 차이 없이 비슷하다만 아무래도 배열, ArrayList가 조금더 빠르다 .
동기화 , 저장시간 , 검색기간이 어떤 컬렉션을 선택해서 사용할 것인지 결정하는 주요요소 이다.