자바

컬렉션에 대한 이해

정채윤 2010. 12. 6. 15:32


컬렉션( Collection ) 이란?

객체가 자료를 저장하고 관리하는 메커니즘을 제공해주는 구조라고 볼 수 있다. 보통 객체가 그런 기능을 제공하기 위해선 Collection 인터페이스를 사용하는데 그런 클레스들을 컬렉션류 라고 부르고 있다.

컬렉션류의 특징
1. 데이터를 보관할 수 있으며, 수정, 삭제, 삽입, 검색 등의 기능을 가지고 있다.
2. 동적으로 메모리를 확장할 수 있는 기능이 있다.

우리가 흔히 사용하는 배열과 구분짓는 특징은 메모리의 사이즈를 동적으로 확장할 수 있다는 것이다. 배열은 첨자로 배열을 생성하고, 데이터를 할당할 때 정확하게 첨자의 범위 내에서만 사용할 수 있다. 만약 배열의 범위를 벗어난다면 IndexOutOfRangeException을 발생시킨다. 컬렉션류는 데이터를 삽입을 했을 때 동적으로 메모리를 늘린다. 이것이 배열과 구분되는 가장 중요한 요소이다.

일반적으로 많이 사용하는 ArrayList나 Hashtable과 같은 컬렉션류는 소형 데이터베이스의 기능인 수정, 삭제, 검색, 삽입의 기능을 할 수 있다. 데이터를 장기간 보관하는 것이 아니라 프로그램이 실행되는 동안에만 사용하는 간단한 저장소 같은 역할을 한다. 그런 의미에 있어서 배열과 같다. 하지만 배열과 차이점은 메모리를 동적으로 확장 가능하다는 측면에 있다. 그리고 컬렉션류 클래스들은 배열로 쉽게 전환할 수 있는 메서드를 포함하고 있다는 것도 기억해 두자.

<JAVA 예제>
Collection 인터페이스 내부구현 메서드 -------------------------------------

- Collection 인터페이스에서 선언한 메소드는 컬렉션 프레임워크의 컬렉션에 참여하는 Collection 클래스들이 지켜야 하는 최소한의 공통된 기능을 말하며, 실제로 그 기능을 어떻게 구현했는 지에 대해서는 개별 클래스에게 전적으로 맡긴다

boolean add( Object o )
boolean addAll( Collection c )
void clear()
boolean contains( Object o )
boolean equals( Object o )
int hashCode()
boolean isEmpty()
Iterator iterator()
boolean remove( Object o )
boolean removeAll( Collection c )
int size()
Object[] toArray()
Object[] toArray( Object[] a )


Iterator 인터페이스 ----------------------------------------

- Iterator 인터페이스는 모든 Collection으로부터 얻을 수 인터페이스다. , 자신이 Collection이라면 반드시 Iterator 인터페이스(Iterator 인터페이스를 구현한 객체)를 리턴할 수 있어야 한다. Iterator 인터페이스는 Collection에 객체를 한번씩 꺼낼 수 있는 방법을 제공하고 있다.

객체의 모임의 형태인 배열의 경우 배열에 있는 특정 객체를 참조하기위해서는 인덱스를
이용해서 특정객체를 바로 참조할 수 있지만, Collection은 가장 일반적인 객체의 모임인 의미 밖에 없으므로 인덱스를 가지고 원하는 객체를 찾을 수 없다

boolean hasNext()
Object next()
void remove()


Set 인터페이스 ----------------------------------------------

- Set은 Collection과 같이 객체들의 모임을 나타낸다. Set 역시 Collection이므로, Collection에서 할 수 있는 모든 행위를 할 수 있다. Collection 인터페이스와 Set인터페이스에서 선언한 메소드의 내용을 살펴보면 다를 바가 없다. Set에는 Collection에서 선언한 메소드 외에 실제로 추가된 메소드가 없다. 다만 Set을 구현하는 구체적인 클래스에서 반드시 지켜야할 사항이 있다. 바로 중복되는 객체(element)는 추가할 수 없는 것이다.

boolean add( Object o )
boolean addAll( Collection c )
void clear()
boolean contains( Object c )
boolean containsAll( Collection c )
boolean equals( Object o )
int hashCode()
boolean isEmpty()
boolean remove( Object o )
boolean removeAll( Collection c )
boolean retainAll( Collection c )
int size()
Object[] toArray()
Object[] toArray( Object[] a )


List 인터페이스 ---------------------------------------------------------------

- 컬렉션 중 List가 갖는 가장 큰 특징은 객체의 순서가 있다는 것이다. 순서가 있다는 것은 List가 갖고 있는 객체마다 순서 번호(인덱스)를 갖고 있다는 뜻이다. List는 배열과 같이 리스트가 갖고 있는 몇 번째 객체를 직접 참조할 수 있다.

리스트는 객체의 순서를 항상 관리하고 있기 때문에 리스트에 객체를 추가할 때 리스트의
맨 끝 부분에만 추가하는 것이 아니라 원하는 위치에 객체를 추가할 수도 있다List Collection 인터페이스에 비해서 상당히 기능이 많아졌다. 가장 기본적인 특징은 위치를 지정하여 객체를 꺼낼 수 있고, List의 부분집합을 List구할 수 있다그리고 Collection이 가지는 Iterator인터페이스 뿐만 아니라 ListIterator라는 인터페이스를 이용할 수 있다.

List
Set과 대별되는 가장 큰 특징은 중복되는 객체를 가질 수 있다는 것이다.
또한 인덱스를 이용해 객체를 한번에 꺼낼수도 있고, 삭제할 수도 있다. Collectin Set경우, 객체를 꺼내려고 할 때는 Iterator 인터페이스를 이용해서 객체를 꺼낼 수 밖에 없지만 List의 경우는 옵션이 하나 더 생긴셈이다.

Object get( int index )
int indexOf( Object o )
int lastIndexOf( Object o )
ListIterator listIterator()
ListIterator listIterator( int index )
Object set( int index, Object o )
List subList( int from, int to )


ListIterator 인터페이스 ---------------------------------------------------

- ListIterator Iterator를 상속한 인터페이스다Collection에서 제공하는 Iterator인터페이스는 Collection을 한 방향으로 탐색하면서 객체에 대한 정보를 얻어낸다. ListIterator List에서 제공하는 인터페이스로 List에 포함된 모든 객체를 양방향으로탐색하면서 객체를 꺼낼 수 있는 방법을 제공하고 있다.

프로그래머는 ListIterator 이용하면 양방향으로 움직여가면서 수정이라던가, iterator 현재 위치를 알아낼수 있다.
List를 사용하는 경우, Collection에서 제공하는 Iterator는 물론 보다 확장된 기능을 갖고 있는 ListIterator를 사용할 수 있다.

boolean hasNext()
boolean hasPrevious()
Object next()
Object previous()
void remove()
void set( Object o )
int nextIndex()
int previousIndex()
void add( Object o )


SortedSet 인터페이스 ---------------------------------------------------

- SortedSet
은 컬렉션의 하나로 Collection이기도하며 Set이기도 하다. 실제로 SoredSet Set을 상속한 인터페이스다.  그래서 Set에서 할 수 있는 모든 메소드 호출을 SortedSet 에서도 할 수 있다. 그리고 SoredSet에서는 Set에서 없었던 몇가지 메소드를 추가로 갖고 있는데, 이는 SortedSet의 이름에서 알수 있듯이 Set보다는 특별한 의미를 갖고 있기 때문입니다.

SortedSet
Set보다 더 특별한 의미를 가지는 이유는
Set은 객체의 순서를 상관하지 않고(순서가 의미가 없지만, 순서를 보장해주지 않지만)  객체의 중복여부에만 관심을 갖는데 반해, SortedSet은 객체의 중복여부뿐만아니라 객체끼리의 순서에도 관심을 갖고 있다.

SortedSet에 있는 객체끼리의 순서가 있다고 해서 List처럼 지정한 위치에 객체를 넣을 수 있다는 뜻은 아니다. SortedSet의 객체의 순서에 관심이 있다는 뜻은 Iterator를 통해서 객체를 탐색시 적절한 순서에 따라  객체를 얻어낸다. SortedSet은 보관하는 객체의 순서가 의미가 있을 때,중복된 객체를 허용하지 않을 때 사용하면 좋겠다.

Comparator comparator()
Object first()
SortedSet headSet( Object to )
Object last()
SortedSet subSet( Object fromElement, Object to Element )
SortedSet tailSet( Object fromElement )


Map 인터페이스 ----------------------------------------------------

- 컬렉션 프레임워크의 맵(Map) 역시 컬렉션처럼 계층적 구조를 가지고 있다. 맵에 참여하는 모든 객체는 Map 입니다.SortedMap은 특별한 Map이라고 할 수 있다. 즉, 컬렉션 프레임워크의 맵은 Map을 정점으로 해서, Map을 상속한 SortedMap이 있다. Map은 키(key)와 값(value)을 일대일로 보관하고 있는 객체다. 아주 쉽게 생각하면 Key를 보관하는 쪽은 Set, 값을 보관하는쪽은 Collection이라고 생각하면 된다.

void clear()
boolean containsKey( Object key )
boolean containsValue( Object v )
Set entrySet()
boolean equals( Object o )
Object get( Object key )
int hashCode()
boolean isEmpty()
Set keySet()
void put( Object key, Object value )
void putAll( Map t )
void remove( Object key )
int size()
Collection values()


<Java Collection 객체 비교표>

1. HashSet ( Set )

가장빠른 Set이다. Hashmap보다는 느리지만 Set인터페이스를 구현하고 있다는 특징이 있다. HashMap은 set 인터페이스를 구현하지 않는다.

2. LinkedHashSet ( Set )
1.4버전부터 제공, LinkedHashMap에 근간해서 작성되었으므로  삽입순서에 따라 배열요소에 접근한다. TreeSet보다 빠르다.

3. TreeSet ( Set )
HashSet보다 느리다. 키 순서에 따른 접근이 가능하다.

4. IdentityHashMap ( Map )
1.4버전부터 제공한다. 동일성( identity )에 근간한 특별한 목적의 HashMap( == ) 동등( equals 메소드 ) 대신의 개념이다. 동일성 개념을 사용할 수 있는 경우 HashMap보다 더 빠른 고성능 대응을 제공한다.

5. HashTable ( Map )
1.4버전부터 제공한다. 엔트리 순서에 있는 링크된 리스트를 유지하는 해시맵을 구현한다. 엔트리 순서에 따른 키 접근이 가능하다. TreeMap보다는 빠르지만 다른 종류의 Map클래스 보다는 느리다.

6. TreeMap ( Map )
HashTable과 HashMap보다 느리다. 키를 순서대로 접근할 수 있다.

7. ArrayList ( List )
가장 빠른 리스트이다. 그러나 배열보다 느리다.

8.Vector ( List )
ArrayList보다 느리지만 동기화된 ArrayList보다는 빠르다.

9. Stack ( List )
Vector와 동일한 속도를 제공하나 LIFO 큐 기능을 제공한다.

10. LinkedList ( List )
다른 List 클래스들 보다 느리다. 그러나 몇 가지 형태의 큐에 있어서는 다른 클래스보다 더 빠르다.