본문 바로가기
programming/java

[java] Collection

by 힐무새 2017. 5. 15.

Collection

Java에서 기본적인 자료구조 제공을 위한 환경을 일컫는 것을 Java collection Framework라고 한다.


그 중 Collection은 자료의 순서나 집합적인 저장공간을 구현하고자 할때 활용할 수 있는 인터페이스이며 Map은 key, value 한 쌍으로 데이터를 다루고자 할 때 활용할 수 있는 인터페이스이다. 모든 collection들에서 공통적으로 활용되는 add(), contain(), size()와 같은 핵심 메서드가 Collection 인터페이스에 선언이 되어 있으며 하위의 List, Set 인터페이스는 Collection 인터페이스를 상속받는다. XhKOu 위 그림은 Collection의 상속, 구현관계를 알 수 있는 diagram이다.

List

List Interface의  특징은 순서가 있는 데이터의 집합이라는 것 이면서 데이터의 중복을 허용한다. 요소들의 순서를 저장하여 색인(index)를 통해 특정 위치에 요소를 삽입하거나 접근, 삭제할 수 있다.
구현 클래스 특징
 LinkedList
  •  양방향 포인터 구조로 데이터의 삽입, 삭제가 번번하게 일어날 시 좋은 성능
  • 스택, 큐, 양방향 큐 등을 만들 때 사용
 Stack
  •  Stack 자료구조를 지원
 ArrayList
  •  배열의 복사를 활용한 데이터 조작
  • 상당히 빠르고 크기를 마음대로 조절할 수 있다
  • 단방향 포인터 구조로 순차적인 접근에 강점이 있음
 Vector
  •  ArrayList의 구형버전
  • 내부적으로 동기화가 수행되어 단일 스레드에서는 ArrayList에 비해 성능이 좋지 않다.

Set

Set interface는 집합을 정의하며 각 요소의 중복을 허용하지 않는다.
구현 클래스 특징
 HashSet
  • 가장 빠른 색인 속도
  • hash 함수에 의해 index가 결정되기 때문에 요소의 순서를 예측하기 힘들다
 LinkedHashSet
  • 추가된 순서 또는 가장 최근에 접근한 순서대로 접근이 가능하다
 TreeSet
  • 정렬된 순서대로 보관이 가능하며 또한 정렬 방법을 지정할 수 있다

동기화와 Collection

동기화는 다중스레드 환경에서 특정 데이터의 일관성 보장에 관련된 내용이다. 여러 스레드가 동시에 Collection에 대해 접근하면 의도하지 않게 요소가 변경되어 데이터의 무결성을 보장할 수 없게된다.
  • 동기화를 지원하는 Collection
    1. Vector
    2. HashTable
  • Collections 메서드를 활용한 방법
    1. list:synchronizedList(동기화가 필요한 list 객체);
    2. Map: synchronizedMap(동기화가 필요한 map 객체);
    3. Set: synchronizedSet(동기화가 필요한 set 객체);

Iterator

Collection에 저장되어 있는 element들을 참조하기 위한 표준 interface이다. 모든 Collection들에 대하여 정보를 얻을 수 있기 때문에 사용자는 Collection 객체이기만 하면 어떤 클래스의 인스턴스인지에 대해 상관하지 않고 사용할 수 있다는 점과 색인만을 위한 interface를 활용한다는 점에서 구현과 색인을 분리하여 다룰 수 있다.

Iterator ? Iterable?

그렇다면 Collection이 아닌 클래스에 대하여 iterator를 활용하기 위해서는 Iterator 인터페이스를 implements하여 사용하는 것이 맞지 않을까? 라고 생각했었다. 그런데 관련 코드를 찾아보니 Iterator 대신 Iterable 인터페이스를 implemenet하여 사용하고 있었다. Stack-overflow에서는 그 둘의 차이를 다음과 같이 설명하고 있었다.

  Iterable : A class that can be iterated over. That is, one that has a notion of "get me the first thing, now the next thing, and so on, until we run out."
  Iterator : A class that manages iteration over an iterable. That is, it keeps track of where we are in the current iteration, and knows what the next element is and how to get it.
 Iterable과 Iterator의 코드는 다음과 같다. An iterator is a simple way of allowing some to loop through a collection of data without assignment privileges (though with ability to remove). 클래스 형태에 따라 Iterator의 generic type을 정해주어야 하기 때문에 Iterator를 반환하는 메서드를 가지고 있는 Iterable과 같은 인터페이스를 구현하여 사용한다. 말이 횡설수설한데, 이에 대하여 더 자세히 알아보기 위해서는 Iterator 패턴을 좀 더 공부해야겠다.

출처: 
http://hackersstudy.tistory.com/26 http://egloos.zum.com/iilii/v/3788564 http://stackoverflow.com/questions/6863182/what-is-the-difference-between-iterator-and-iterable-and-how-to-use-them




'programming > java' 카테고리의 다른 글

[java] 정규 표현식  (0) 2017.06.01
[java] StringBuilder, StringBuffer의 차이  (0) 2017.06.01
[java]thread  (0) 2017.06.01
싱글톤(Singleton)  (6) 2017.05.11
[java] jdbc를이용한 oracle database 연결  (4) 2017.05.11