티스토리 뷰

컬렉션 프레임워크의 주요 인터페이스로는 List, Set, Map이 있다.

인터페이스 분류 특징 구현 클래스
Collection List -순서를 유지하고 저장
-중복 저장 가능
ArrayList, Vector,
LinkedList
Set -순서를 유지하지 않고 저장
-중복 저장 안 됨
HashSet, TreeSet
Map -키와 값의 쌍으로 저장
-키는 중복 저장 안 됨
HashMap, Hashtable,
TreeMap, Properties

 

List 컬렉션

ArrayList : 인덱스 검색이나, 맨 마지막에 객체를 추가하는 경우에는 ArrayList가 더 좋은 성능을 발휘한다.

Vector : ArrayList와 다른 점은 Vector는 동기화된(Synchronized) 메소드로 구성되어 있기 때문에 스레드가 안전(Thread Safe)하다.

LinkedList : 빈번한 객체 삭제와 삽입이 일어나는 곳에서는 ArrayList보다 LinkedList가 좋은 성능을 발휘한다.

 

Set 컬렉션

HashSet : HashSet은 객체를 저장하기 전에 먼저 객체의 hashCode() 메소드를 호출해서 이미 저장되어 있는 객체들의 해시 코드와 비교한다. 만약 동일한 해시 코드가 있다면 다시 equals() 메소드로 두 객체를 비교해서 true가 나오면 동일한 객체로 판단하고 중복 저장을 하지 않는다.

 

Map 컬렉션

HashMap : 동일한 키가 될 조건은 hashCode()의 리턴값이 같아야 하고, equals() 메소드가 true를 리턴해야 한다. 만약 기존에 저장된 키와 동일한 키로 값을 저장하면 기존의 값은 없어지고 새로운 값으로 대치된다.

Hashtable : HashMap과의 차이점은 Hashtable은 동기화된(Synchronized) 메소드로 구성되어 있기 때문에 스레드가 안전(Thread Safe)하다라고 말한다.

Properties : Properties는 Hashtable의 하위 클래스이다. Properties는 키와 값을 String 타입으로 제한한 컬렉션이다. Properties 파일은 키와 값이 = 기호로 연결되어 있는 텍스트 파일로 ISO 8859-1 문자셋으로 저장된다.

 

검색 기능을 강화시킨 컬렉션

TreeSet은 Set 컬렉션이고, TreeMap은 Map 컬렉션이다. 이 컬렉션들은 이진 트리(binary tree)를 이용해서 계층적 구조를 가지면서 객체를 저장한다.

TreeSet의 객체와 TreeMap의 키는 저장과 동시에 자동 오름차순으로 정렬되는데, 숫자 타입일 경우에는 값으로 정렬하고, 문자열 타입일 경우에는 유니코드로 정렬한다. TreeSet과 TreeMap은 정렬을 위해 java.lang.Comparable을 구현한 객체를 요구하는데, 사용자 정의 클래스도 Comparable을 구현한다면 자동 정렬이 가능하다.

TreeSet : TreeSet에 객체를 저장하면 자동으로 정렬되는데 부모값과 비교해서 낮은 것은 왼쪽 자식 노드에, 높은 것은 오른쪽 자식 노드에 저장한다.

TreeMap : TreeSet과의 차이점은 키와 값이 저장된 Map.Entry를 저장한다는 점이다. TreeMap에 객체를 저장하면 자동으로 정렬되는데, 기본적으로 부모 키값과 비교해서 키 값이 낮은 것은 왼쪽 자식 노드에, 키 값이 높은 것은 오른쪽 자식 노드에 Map.Entry 객체를 저장한다.

 

LIFO와 FIFO 컬렉션

Stack : 스택을 응용한 대표적인 예가 JVM 스택 메모리이다.

Queue : 큐를 응용한 대표적인 예가 스레풀의 작업 큐이다. Queue 인터페이스를 구현한 대표적인 클래스는 LinkedList이다.

 

동기화된 컬렉션

컬렉션 프레임워크의 대부분의 클래스들은 싱글 스레드 환경에서 사용할 수 있도록 설계되었다.

Vector와 Hashtable은 동기화된(Synchronized) 메소드로 구성되어 있기 때문에 멀티 스레드 환경에서 안전하게 요소를 처리할 수 있지만, ArrayList와 HashSet, HashMap은 동기화된 메소드로 구성되어 있지 않아 멀티 스레드 환경에서 안전하지 않다.

이런 경우를 대비해서 컬렉션 프레임워크는 비동기화된 메소드를 동기화된 메소드로 래핑하는 Collections의 synchronizedXXX() 메소드를 제공하고 있다. 매개값으로 비동기화된 컬렉션을 대입하면 동기화된 컬렉션을 리턴한다.

리턴 타입 메소드(매개 변수) 설명
List<T> synchronizedList(List<T> list) List를 동기화된 List로 리턴
Map<K, V> synchronizedMap(Map<K, V> m) Map을 동기화된 Map으로 리턴
Set<T> synchronizedSet(Set<T> s) Set을 동기화된 Set으로 리턴

 

병렬 처리를 위한 컬렉션

동기화된(synchronized) 컬렉션은 멀티 스레드 환경에서 하나의 스레드가 요소를 안전하게 처리 하도록 도와주지만, 전체 요소를 빠르게 처리하지는 못한다. 자바는 멀티 스레드가 컬렉션의 요소를 병렬적으로 처리할 수 있도록 특별한 컬렉션을 제공하고 있다. java.util.concurrent 패키지의 ConcurrentHashMap과 ConcurrentLinkedQueue이다. ConcurrentHashMap은 Map 구현 클래스이고, ConcurrentLinkedQueue는 Queue 구현 클래스이다.

ConcurrentHashMap : ConcurrentHashMap을 사용하면 스레드에 안전하면서도 멀티 스레드가 요소를 병렬적으로 처리할 수 있다. 이것이 가능한 이유는 ConcurrentHashMap은 부분(Segment) 잠금을 사용하기 때문이다.

ConcurrentLinkedQueue : ConcurrentLinkedQueue는 락-프리(lock-free) 알고리즘을 구현한 컬렉션이다. 락-프리 알고리즘은 여러 개의 스레드가 동시에 접근할 경우, 잠금을 사용하지 않고도 최소한 하나의 스레드가 안전하게 요소를 저장하거나 얻도록 해준다.

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
글 보관함