반응형

Java Collections Framework(JCF)

 

Java에서 컬렉션(Collection)이란 데이터의 집합, 그룹을 의미하며 

 

JCF(Java Collections Framework)는 이러한 데이터, 자료구조인 컬렌션과 이를 구현하는 클래스를 정의하는 인터페이스를 제공한다.

 

다음은 Java 컬렌션 프레임워크의 상속구조를 나타낸다.

상위 인터페이스 크게 분류

List

Set

Queue

 

그리고 Map 같은 경우는 Collection 인터페이스를 상속 받고 있지 않지만 Collection 으로 분류됨

 

1. Set 인터페이스

 

순서를 유지하지 않는 데이터의 집합으로 데이터의 중복을 허용하지 않는다.

  • HashSet
    - 가장빠른 임의 접근 속도
    - 순서를 예측할 수 없음

문법(복붙용)

import java.util.HashSet;

public class CollectionTemp {

	public static void main(String[] args) {
		
			HashSet<String> hs = new HashSet<String>(); // HashSet 선언
		
			hs.add("홍길동");
			hs.add("아기장수 우투리");
			hs.add("홍길동");
			hs.add("춘향");

			System.out.println(hs);

			
	}

}

//결과 [홍길동,춘향,아기장수 우투리]
// 홍길동을 두번 넣었음에도 한번만 값이 넣어져있다. (HashSet의 특성인 중복값 무시)
  • TreeSet
    - 정렬방법을 지정할 수 있음
import java.util.TreeSet;

public class CollectionTemp {

	public static void main(String[] args) {
		
			TreeSet<String> ts = new TreeSet<String>();
			
			   	ts.add("apple");
		        ts.add("airplane");
		        ts.add("alien");
		        ts.add("disc");
		        ts.add("dance");
		        
		        System.out.println(ts.headSet("b"));
		        System.out.println(ts.subSet("a", "al"));
		        System.out.println(ts.tailSet("c"));
			
	}

}
//결과 : [airplane,alien,apple] ts.headSet("b") 시작이 b 보다 작은 a로 시작하는 데이터들
//		 [airplane]  ts.subSet("a", "al") a ~ al 사이에 있는 데이터 from ~ to 
//		 [dance,disc] ts.tailSet("c") headSet의 반대 시작이 c 보다 큰 d부터 시작하는 데이터들

 

HashSet vs TreeSet 

 

HashSet과 TreeSet 모두 중복을 허용하지 않고 순서가 없는 컬렉션

1. 구현 방식
 - HashSet은 해싱을 이용하여 구현
 - TreeSet은 이진탐색트리를 이용하여 구현

2. 속도 비교
 - HashSet > TreeSet
 - 해싱이 이진탐색트리보다 빠르다

3. 정렬 기능
 - HashSet < TreeSet
 - 이진탐색트리를 이용했기 때문에 데이터 정렬이 가능 (Comparator 이용)

 

성능

HashSet > TreeSet > LinkedHashSet

 

예시) 이런 상황을 가정해보겠습니다.

어떤 웹 사이트에서 하루에 접속하는 사람들 수를 구하고자 합니다.

접속하는 IP를 세면 되겠죠.

근데 한사람이 여러번 접속하면 한 IP가 여러번 찍힐 것입니다.

이건 한번으로 카운트 해줘야 제대로 된 접속자 수를 구할 수 있습니다.

이럴 때 쓰는게 Set입니다.

그냥 수학에서 집합 이라고 보시면 됩니다.

 

2. List 인터페이스

 

순서가 있는 데이터의 집합으로 데이터의 중복을 허용한다.

  • LinkedList
    - 양방향 포인터 구조로 데이터의 삽입, 삭제가 빈번할 경우 데이터의 위치정보만 수정하면 되기에 유용
    - 스택, 큐, 양방향 큐 등을 만들기 위한 용도로 쓰임
  • Vector
    - 과거에 대용량 처리를 위해 사용했으며, 내부에서 자동으로 동기화처리가 일어나 비교적 성능이 좋지 않고 무거워 잘 쓰이지 않음
  • ArrayList
    - 단방향 포인터 구조로 각 데이터에 대한 인덱스를 가지고 있어 조회 기능에 성능이 뛰어남

 

3. Map 인터페이스

 

키(Key), 값(Value)의 쌍으로 이루어진 데이터으 집합으로,

순서는 유지되지 않으며 키(Key)의 중복을 허용하지 않으나 값(Value)의 중복은 허용한다.

  • Hashtable
    - HashMap보다는 느리지만 동기화 지원
    - null불가
  • HashMap
    - 중복과 순서가 허용되지 않으며 null값이 올 수 있다.
  • TreeMap
    - 정렬된 순서대로 키(Key)와 값(Value)을 저장하여 검색이 빠름

 

 

반응형

+ Recent posts