Java Collection - 세트(Set) 구현해보기
Set 구현에는 간단하다. 인덱스가 없으므로 단순히 데이터를 넣고, 유무를 확인하고, 삭제 정도가 있다. 조건으로 데이터가 들어온 경우 기본 데이터가 있는지만 확인한다.
HashSet.class
import java.util.Arrays;
public class HashSet {
private int[] elementData = new int[10];
private int size = 0;
public boolean add(int value) {
// O(n) 속도
if (contains(value)) {
return false;
}
elementData[size] = value;
size++;
return true;
}
private boolean contains(int value) {
// O(n) 속도
for (int data : elementData) {
if (data == value) {
return true;
}
}
return false;
}
public int size() {
return size;
}
@Override
public String toString() {
return "HashSet{" +
"elementData=" + Arrays.toString(Arrays.copyOf(elementData, size)) +
", size=" + size +
'}';
}
}
HashSet - add 메소드
- add 메소드는 요소에 데이터를 보관한다.
- 보관할 데이터 중 중복된 데이터가 있는 경우 무시하나. 테스트로 구성하였으므로 contains 메소드로 값이 존재하는지 확인한다.
HashSet - contains 메소드
- contains 메소드는 주로 요소를 보관하는 ElementData 에서 특정 값이 존재하는지 확인한다.
HashSet - Size 메소드
- 요소 보관함에 들어간 데이터를 반환한다.
다음으로 HashSet 사용한 main 메소드를 돌려본다.
Main.class
public class Main {
public static void main(String[] args) {
HashSet set = new HashSet();
set.add(1);
set.add(2);
set.add(3);
set.add(4);
set.add(5);
System.out.println(set.size());
System.out.println("1 값이 존재하는가? " + set.contains(1));
System.out.println("10 값이 존재하는가? " + set.contains(10));
System.out.println("3 값을 중복해서 입력되는가? " + set.add(3));
System.out.println(set);
}
}
5
1 값이 존재하는가? true
10 값이 존재하는가? false
3 값을 중복해서 입력되는가? false
HashSet{elementData=[1, 2, 3, 4, 5], size=5}
초기 Set 자료 구조는 단순하나 데이터 추가, 검색에 O(n) 으로 성능이 좋지 않을 것을 볼 수 있다. 데이터가 많을 수록 점점 효율이 감소하여 검색에서는 ArrayList, LinkedList O(n) 속도라도 받아 들일 수 있으나, 데이터 추가인 add 메소드에서 느려지는 것은 납득하기가 어렵다. 중복 데이터가 있는지 전체 데이터를 확인하는 작업이 있어야 데이터를 넣을 수 있기 떄문이다.