성장일기

Java 컬렉션(Collection) 이란?


 JCF(Java Collectoin Framework)는 데이터들을 저장하고 관리하는 다양한 자료구조를 인터페이스들로 정의하고 각각의 구현체들을 제공한다. 대표적인 인터페이스로는 List, Set, Map이 있으며 각 인터페이스를 구현한 클래스들은 다양하게 존재하며, 아래 그림은 각 인터페이스와 구현체의 상속관계를 나타내고 있다.

 

java 컬렉션 상속 구조

 Map 인터페이스는 Collection을 상속받고 있지 않지만 일반적으로 Collection으로 분류된다.

 

 

1. List 인터페이스


 list는 순서가 있는 데이터의 집합으로, 데이터의 중복을 허용하는 자료구조이다. 배열과 비슷하다. list는 객체 자체를 저장하는 것이 아니라 객체의 주소를 참조한다. 따라서 동일한 객체를 중복 저장할 수 있는데, 이 경우에는 동일한 주소가 참조되고 null이 저장될 경우에는 해당 인덱스는 객체를 참조하지 않는다.

 

 

  • ArrayList
List<E> list = new ArrayList<E>();

- 단방향 포인터 구조로 각 데이터에 대한 인덱스를 가지고 있다.

- 더 이상 저장공간이 없으면, 더 큰 새로운 배열을 생성해 기존의 배열에 저장된 내용을 복사한다.

- 중간에 데이터가 삽입되면, 데이터들이 뒤로 밀리면서 성능저하가 크다.

  • Vector
List<E> list = new Vector<E>();

- 과거에 대용량 데이터 처리를 위해 사용했으나, 내부에서 쓰레드의 개수와 상관없이 동기화 처리를 하므로 성능이 좋지않아 최근에는 쓰이지 않는다.

- Thread - safe

 

  • LinkedList
List<E> list = new LinkedList<E>();

- 양방향 포인터 구조로 내부 객체를 저장해서 인덱스로 관리하지만, 인접 참조를 링크해서 체인처럼 관리한다.

- 스택, 큐, 양방향 큐 등을 만들기 위한 용도로 쓰인다.

 

 

+ ArrayList vs LinkedList

- 단순히 데이터를 조회하거나, 맨 마지막에 객체를 추가하는 경우가 빈번히 발생하면 ArrayList가 데이터가 중간에 추가, 삭제가 빈번히 일어나면 LinkedList가 더 좋은 성능을 발휘한다. 이유는 위에서 설명한 각 내부구조의 특징 때문이다.

 

 

2. Set 인터페이스


 Set은 순서가 없는 데이터 집합이고, 데이터의 중복을 허용하지 않는다. 수학에서의 집합의 개념과 비슷하다.

 

  • HashSet
Set<E> set = new HashSet<E>();

- 빠른 접근속도를 가지고 있지만, 순서를 보장하지 않음

- 동일한 객체는 중복을 허용하지 않는다.

- 객체를 저장하기 전에 객체의 hash Code()메소드를 호출하여 해시코드를 얻어낸다.(중복 허용 검증)

  • LinkedHastSet
Set<E> set = new LinkedHashSet<E>();

- 순서를 보장한다.

 

  • TreeSet
Set<E> set = new TreeSet<E>();

- 정렬방법을 지정할 수 있다.

 

 

3. Map 인터페이스


 Map은 키(key)와 값(value) 형식의 쌍으로 구성된 객체를 저장하는 구조를 가지고 있다. 순서는 보장하지 않으며 키(key)의 중복을 허용하지 않으나 값(value)은 중복 저장할 수 있다. 키는 해당 Map에서 고유해야한다.

 

 

  • HashMap
Map<String, String> map = new HashMap<String, String>();

- HashMap의 키로 사용할 객체는 hashCode()와 equals()메소드를 재정의(method overried)해서 객체가 될 조건을 정해야 한다.

- 주로 키(key)타입은 String을 많이 사용하는데, String은 문자열이 같으면 동등 객체가 될 수 있도록 hashCode()와 equals() 메소드가 재정의 되어있기 때문이다.

 

  • HashTable
Map<String, String> map = new HashTable<String, String>();

- HashMap보다는 느리지만 동기화를 지원한다.

- null불가

 

  • TreeMap
Map<String, String> map = new TreeMap<String, String>();

- 이진트리를 기반으로 한 Map 컬렉션이다. 

- 키(key)와 값(value)를 저장하는 동시에 키를 정렬한다. (숫자 > 알파벳 대문자 > 알파벳 소문자 > 한글)

- 검색기능을 사용할 경우 HashMap보다 빠르다.

공유하기

facebook twitter kakaoTalk kakaostory naver band