JAVA Collections(Set, List, Map)
배열은 크기가 수정할 수 없기 때문에 Collections Framework을 사용하여 배열의 불편함을 줄일 수 있다. 하지만 데이터의 사이즈가 변동하는 경우에만 Collection계통의 클래스를 사용하며, 그외에는 배열을 사용하는 것이 시간, 공간 모든면에서 효율적이다.
* 일반적으로 배열 접근(element[i])은 ArrayList를 사용했을 때(elements.get(i))에 비해 10배 이상 빠르다고 한다. 대부분의 경우 유연성 문제 때문에 배열보다는 다른 컬렉션을 사용하고, 프로그램의 일부에서 성능이 중요한 경우 배열을 사용하는 것도 고려하는 것이 좋을 듯
Collection
오브젝트 집합을 나타내는 가장 기본적인 인터페이스이며, Set과 List가 상속을 받아 하위 클래스를 구현 한다. 따라서 Set과 List는 Collection이 가지고 있는 공통의 조작 방법을 가지고 있다.
[출처 : https://prashantgaurav1.files.wordpress.com/2013/12/java-util-collection.gif]
Set
Collection 인터페이스를 상속받으며, 순서와 중복이 없다. SortedSet은 순서는 있으나 중복이 없다.
HashSet : HashMap 인터페이스를 기본으로 Set인터페이스를 구현한 것. 순서를 보장할 수 없다. Set의 기능만 필요한 경우 사용
TreeSet : TreeMap 인터페이스를 기본으로 Set인터페이스를 구현한 것. 올림순으로 소트된다. 요소를 올림차순으로 정렬하는 경우 사용
LinkedHashSet : 삽입된 순서를 기억한다. 같은 요소를 다시 삽입하면 이전 순서를 그대로 기억한다. 요소의 삽입순서를 기억할 필요가 있을 때 사용
List
Collection 인터페이스를 상속받으며, 일부 함수를 재정의 했다. 순서가 있고 중복이 허용된다.
Vector : JAVA 1.1 이하 버전에서 사용되였으며, 동기화 처리가 되기 때문에 다른 List에 비해 성능이 떨어진다. 현재는 구버전 호환용.
* 동기화가 필요 할 때에는 Collections.synchronized 시리즈를 사용하는 것이 성능상 바람직 하다.
ArrayList : List 인터페이스 속성을 갖고 배열크기를 변경할 수 있다. 배열크기를 조작하는 메소드를 제공한다. 내부적으로 자료를 Array(배열)구조로 가지고 있는 객체. 데이터 추가, 삭제 시 내부적으로 임시배열을 작성 후 데이터를 복사하는 방법을 사용.
장점 : 각 데이터에 대한 인덱스를 가지고 있기 때문에 검색이 빠르다.
단점 : 대량의 데이터 추가, 삭제를 하는 경우에는 배열의 복사가 빈번하게 일어나 성능저하를 가져온다.
LinkedList : ArrayList처럼 인덱스를 가지고 있는 것이 아니라 자신 다음에 오는 자료의 위치정보만 가지고 있다.
장점 : 삽입, 삭제는 데이터의 위치정보만 가지고 할 수 있기 때문에 데이터가 많은 경우 유리하다.
단점 : 인덱스를 가지고 있는 것이 아니기 때문에 데이터가 많은 경우 처음부터 해당 데이터까지 순차적으로 찾기 때문에 속도가 느리다.
Iterator
기본적인 Collection 인터페이스로 순차열람(iteration)을 지원한다. 어떤 변수를 Iterator로 선언하는 것은 그 변수가 여러 개의 값을 갖고 있음을 뜻한다.Set과 List에서 동작이 가능하며 기본적으로 Iterator 인터페이스에서 지원하는 세가지 메소드 (hasNext(), next(), remove())를 사용할 수 있다.
import java.util.HashSet;
import java.util.Iterator;
public class 이터레이터 {
public static void main(String[] args) {
HashSet<Integer> A = new HashSet<Integer>();
A.add(3);
A.add(2);
A.add(1);
Iterator hi = A.iterator(); //<- 오름차순으로 정렬된 값들임
while(hi.hasNext()){
System.out.println(hi.next());
}
}
}
출력값
1
2
3
hi에 A의 iterator를 넣게되면 값들이 오름차순으로 정렬이 된 상태의 배열(?)이 생성이 되고, hasNext()함수로 내부에 값들이 있는지 확인가능하며, next()함수를 첫번째 값이 리턴이되며 iterator안의 꺼낸 값은 사라지게 된다. 위 코드에서는 hi에 있는 값들을 모두 꺼내왔기 때문에 hi안에는 값이 없는 빈 상태가 된다.
Map
키(key)와 값(value)의 쌍으로 저장이 된다.
HashMap : 동기화되어 있지않다는 것과 Null을 허용한다는 것 이외에는 HashTable과 같다. Map의 기능만 필요한 경우 사용
TreeMap : Red-Black Tree. 키의 올림순으로 소트된다. 키를 오름차순으로 정렬할 필요가 있을 때 사용
LinkedHashMap : 키가 맵에 삽입된 순서를 기억한다. 같은 키로 삽입해도 이전의 순서를 기억한다. 키의 삽입 순서를 기억할 필요가 있을 때 사용
HashTable : Vector와 마찬가지로 동기화 되어있기 때문에 성능면에서 다른 것들에 비해 떨어진다.
[출처]
https://opentutorials.org/module/516/6446
http://mousevm.tistory.com/221
http://java-school.net/java/Collection
http://pracon.tistory.com/107
http://egloos.zum.com/dojeun/v/317868
http://bestalign.github.io/2015/09/02/top-10-mistakes-java-developers-make-2/
http://seeit.kr/36
[참고]
https://docs.oracle.com/javase/7/docs/api/java/util/Collections.html
'프로그래밍 > JAVA' 카테고리의 다른 글
객체 지향 프로그래밍(Object-Oriented Programming) (0) | 2017.03.23 |
---|---|
오버로딩 VS 오버라이딩 (0) | 2017.02.08 |