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은 순서는 있으나 중복이 없다.


HashSetHashMap 인터페이스를 기본으로 Set인터페이스를 구현한 것. 순서를 보장할 수 없다. Set의 기능만 필요한 경우 사용

TreeSetTreeMap 인터페이스를 기본으로 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
블로그 이미지

D.Story

,