Formoat's Open Blog
컬렉션 - Set 본문
인터페이스 | 구현 클래스 | 특징 |
Set | HashSet, LinkedHashSet, TreeSet | 순서 유지(X), 중복 저장(X), 집합에 비유됨, 하나의 null값 저장 가능 |
1. HashSet
요소들을 순서 없이 저장하고, 중복 저장하지 않는다. Set의 중복 개념은 꼭 같은 인스턴스를 의미하지 않는다.
다른 인스턴스라고 하더라도 동등한 객체라면 중복으로 판단해 저장하지 않는다.
동등한 객체인지를 판별하기 위해서 Object 클래스에서 상속받는 hashCode() 메소드와 equals() 메소드를 이용하게 되는데,
먼저 hashCode() 메소드를 이용해 두 객체의 해시코드가 같은지 판별한 뒤 만약 해시코드가 같다면 equals()메소드를 이용해
두 객체를 비교해 최종적으로 동등한 객체인지 여부를 판단한다.
Member.java
// <소스> 동등 객체 판별을 위한 메소드 재정의 방법
public class Member {
private String name;
private int age;
// equals 메소드 재정의
@Override
public boolean equals(Object obj) {
if (obj instanceof Member) {
Member member = (Member)obj;
return member.name.equals("name") && member.age == age;
}else
return false;
}
// hashCode 메소드 재정의
@Override
public int hashCode() {
return Objects.hash(name, age);
}
}
2. LinkedHashSet
요소의 head와 tail의 주소값을 참조하여 체인처럼 연결시켜 관리하는 것은 List와 같다.
LionkedHashSet은 Set의 특성과 다르게 순서가 존재한다 인덱스가 존재하지 않기때문에 중간에 값을 추가할 수 없고,
객체를 추가한 순서대로 Set에 저장이 된다. 어떻게 보면 LinkedList와 더 유사한 것 같다. 다만 다른점은 Set이기 때문에
중복값을 허용하지 않는다.
3. TreeSet
검색 기능을 강화시킨 컬렉션으로 이진 트리를 기반으로 한 Set 컬렉션이다. 이진 트리 기반에 노드들로 구성이 되며,
하나의 노드는 노드값인 value, 왼쪽, 오른쪽 자식노드를 참조하기 위한 두 개의 변수로 구성된다. TreeSet에 객체를 저장하면
부모노드의 value와 비교 후 작다면 왼쪽 노드, 크다면 오른쪽 노드에 자동으로 정렬되어 저장된다.
Function | Return Type | Method | Remarks |
추가 | boolean | add(E e) | 해당 집합(set)에 전달된 요소를 추가 |
검색 | boolean | contains(Object o) | 해당 집합이 전달된 객체를 포함하고 있는지 확인 |
boolean | equals(Object o) | 해당 집합과 전달된 객체가 같은지 확인 | |
boolean | isEmpty() | 해당 집합이 비어있는지 확인 | |
int | size() | 해당 집합의 요소의 총 개수를 반환 | |
제거 | void | clear() | 해당 집합의 모든 요소를 제거 |
boolean | remove(Object o) | 해당 집합에서 전달된 객체를 제거 | |
기타 | Object[] | toArray() | 해당 집합의 모든 요소를 Object타입의 배열로 반환 |
Iterator<E> | iterator() | 해당 집합의 반복자를 반환 |
<표> Set 컬렉션의 주요 메소드
Set 컬렉션은 인덱스를 또는 객체를 이용해 검색해 가져오는 메소드가 없다.
때문에 for문을 이용해 가져오는 방법이나 반복자(Iterator)를 이용해 가져오는 방법을 사용한다.
Return Type | Method | Remarks |
boolean | hasNext() | 가져올 객체가 존재한다면 true 없다면 false 반환 |
E | next() | 컬렉션에서 하나의 객체를 가져온다. |
void | remove() | 컬렉션에서 객체를 제거한다. |
<표> Iterator의 주요 메소드
IteratorExample.java
public class IteratorExample {
public static void main(String[] args) {
HashSet<Integer> set = new HashSet<Integer>();
set.add(5);
set.add(3);
set.add(1);
set.add(4);
// for문을 이용한 출력
for (int x : set)
System.out.print(x+" ");
System.out.println();
// 반복자(Iterator)를 이용한 출력
Iterator<Integer> iterator = set.iterator();
while(iterator.hasNext()) {
int x = (int)iterator.next();
System.out.print(x+" ");
}
}
}
// 실행결과 //
----------------------------------------------------
1 3 4 5
1 3 4 5
'Java > Java Basic' 카테고리의 다른 글
컬렉션 - Tree (0) | 2019.09.04 |
---|---|
컬렉션 - Map (0) | 2019.09.04 |
컬렉션 - List (0) | 2019.09.04 |
컬렉션 프레임워크 (Collection Framework) (0) | 2019.09.03 |
함수적 인터페이스 - Predicate (0) | 2019.09.03 |