컬렉션 프레임워크(Collections Framework) - Set Interface

ImOk·2022년 1월 3일
0
post-thumbnail

📚 Set Interface

  • 저장 순서가 유지되지 않는다.
  • 객체를 중복해서 저장할 수 없고, 하나의 null만 저장할 수 있다.
  • 인덱스로 관리하지 않기 때문에 인덱스를 매개값으로 갖는 메소드가 없다.

[ Set 인터페이스에서 공통적으로 사용하는 메소드 ]

기능메소드설명
객체 추가boolean add(E e)주어진 객체를 저장한다. 객체가 성공적으로 저장되면 true를 리턴, 중복이면 false를 리턴
객체 검색boolean contains(Object o)주어진 객체가 저장되어 있는지 조사
boolean isEmpty()컬렉션이 비어 있는지 조사
Iterator<E> iterator()저장된 객체를 한 번씩 가져오는 반복자를 리턴
int size()저장되어 있는 전체 객체 수 리턴
객체 삭제void clear()저장된 모든 객체 삭제
boolean remove(Object o)주어진 객체를 삭제

💻 Set 예제

// String 객체를 저장하는 HashSet 생성
Set<String> set = new HashSet<String>();

set.add("Java");
set.add("JDBC");
set.add("Servlet/JSP");
set.add("Java"); //중복 안됨
set.add("iBATIS");

System.out.println("총 객체수: " + set.size());

Iterator<String> iterator = set.iterator(); //반복자

while(iterator.hasNext()) { //객체 수만큼 루핑
String element = iterator.next(); //1개의 객체를 가져옴
System.out.println("\t" + element);
}

set.remove("JDBC");
set.remove("iBATIS");

System.out.println("총 객체수: " + set.size());

//for문으로도 가능
for(String element : set) {
System.out.println("\t" + element);
}

set.clear();		
if(set.isEmpty()) { System.out.println("비어 있음"); }

🔔 Set 예제 출력

총 객체수: 4
	Java
	JDBC
	Servlet/JSP
	iBATIS
총 객체수: 2
	Java
	Servlet/JSP
비어 있음


1. HashSet

  • Set 인터페이스를 구현한 가장 대표적인 컬렉션
  • 순서 없이 저장하고 동일한 객체는 중복 저장하지 않는다.
  • 객체를 저장하기 전에 먼저 객체의 hashCode() 메소드를 호출해 비교 한다. 동일한 해시코드가 있다면 다시 equals() 메소드로 두 객체를 비교해 true 가 나오면 동일한 객체로 판단해 중복 저장을 하지 않는다.
  • 저장 순서를 유지하고자 한다면 LinkedHashSet을 사용해야한다.
Set<E> set = new HashSet<E>();
Set<E> set = new HashSet<>();

2. TreeSet

  • 이진 검색 트리라는 자료구조의 형태로 데이터를 저장하는 컬렉션 클래스
  • 순서 없이 저장하고 동일한 객체는 중복 저장하지 않는다.

🎄 이진 검색 트리(binary search tree)

  • 모든 노드는 최대 두 개의 자식노드를 가질 수 있다.
  • 왼쪽 자식노드의 값은 부모노드의 값보다 작고, 오른쪽 자식노드의 값은 부모노드의 값보다 커야한다.
  • 노드의 추가 삭제에 시간이 걸린다. (순차적으로 저장하지 않으므로)
  • 검색(범위검색)과 정렬에 유리하다
  • 중복된 값을 저장하지 못한다.
메소드설명
headSet(Object toElement)지정된 객체보다 작은 값의 객체들을 반환
tailSet(Object fromElement)지정된 객체보다 큰값의 객체들을 반환
subSet(Object fromElement, Object toElement)범위 검색(fromElement와 toElement 사이)의 결과를 반환한다. (끝 범위인 toElement는 범위에 포함되지 않음)

💻 TreeSet 예제

class TreeSetEx1 {
	public static void main(String[] args) {
		TreeSet<String> set = new TreeSet<String>();

		String from = "b";
		String to = "d";

		set.add("abc");	set.add("alien"); set.add("bat"); set.add("car");
		set.add("Car");	set.add("disc"); set.add("dance"); set.add("dZZZZ");
		set.add("dzzzz"); set.add("elephant"); set.add("elevator"); 
		set.add("fan"); set.add("flower");

		System.out.println(set);
		System.out.println("range search : from " + from + " to " + to);
		System.out.println("result1 : " + set.subSet(from, to));
		System.out.println("result2 : " + set.subSet(from, to + "zzz"));
	}
}

class TreeSetEx2 {
	public static void main(String[] args) {
		TreeSet<Integer> set = new TreeSet<Integer>();
		int[] score = { 80, 95, 50, 35, 45, 65, 10, 100 };

		for (int i = 0; i < score.length; i++)
			set.add(new Integer(score[i]));

		System.out.println("50보다 작은 값 :" + set.headSet(new Integer(50)));
		System.out.println("50보다 큰 값 :" + set.tailSet(new Integer(50)));
	}
}

🔔 TreeSet 예제 출력

[Car, abc, alien, bat, car, dZZZZ, dance, disc, dzzzz, elephant, elevator, fan, flower]
range search : from b to d
result1 : [bat, car]
result2 : [bat, car, dZZZZ, dance, disc]

---

50보다 작은 값 :[10, 35, 45]
50보다 큰 값 :[50, 65, 80, 95, 100]


📖 참고 문헌

profile
ImOk👌

0개의 댓글