Set 인터페이스를 공부하기에 앞서 Collection 인터페이스에 대해 모른다면 아래 링크를 걸어 놓을테니 읽어보는 것을 추천한다.

 

ckprk.tistory.com/27

 

[자바] 컬렉션 프레임워크 [Collection 인터페이스]

컬렉션 프레임워크란 무엇인가? 흔히 프로그램 개발을 건물 짓는 일에 비유한다. 원하는 건물을 지으려면 구조를 잘 잡아야하듯이 프로그램을 개발할 때도 사용하는 자료를 어떤 구조로 관리할

ckprk.tistory.com

 

자, 이제 그럼 Collection 인터페이스에서 제공하는 set인터페이스에 대해 알아보겠다.

set은 한마디로 '집합'이다. 수학시간에 배운 그 '집합'을 생각하면 된다. 집합은 어떤 요소가 어디에 속해있고 없고가 중요한 것이지 집합 안에서의 순서는 중요하지 않다. 자바에서 제공하는 set인터페이스도 이와 같다고 생각하면 된다.

 

그렇다면 자바에서 set의 종류는 어떤 것들이 있을까?

 

HashSet, TreeSet, LinkedHashSet 이렇게 총 세 가지이다.

 

각 set을 구현한 소스를 보기에 앞서 각각 간단하게 설명하고 넘어가겠다.

▶HashSet은 입력 순서와 상관없이 데이터를 저장한다.

▶TreeSet은 입력 순서와 상관은 없지만 정렬이 된 상태로 저장을 한다.

▶LinkedHashSet은 입력한 순서대로 데이터를 저장한다.

 

HashSet(입력 순서와 상관없이 데이터를 저장)

import java.util.HashSet;
import java.util.Iterator;

public class Main {

	public static void main(String[] args) {
		HashSet<String> hs1 = new HashSet<String>();
		
		hs1.add("pear");
		hs1.add("apple");
		hs1.add("tomato");
		hs1.add("pear");
		
		Iterator<String> itr = hs1.iterator();
		while(itr.hasNext()) {  //반복자를 이용해서 저장된 데이터를 전부 출력하고 있다.
			System.out.println(itr.next());
		}
	}
}
apple
pear
tomato

소스를 보면 apple, pear, tomato 순으로 입력이 되었고 다시 pear를 입력하였다. 출력결과를 보면 입력 순서와 상관이 없는 저장상태를 보여줄 뿐더러 중복입력한 pear는 하나만 저장이 되어있다. 앞서 설명한 부분이지만 set인터페이스는 집합이기에 중복값은 유효하지 않다.

 

우리는 집합을 공부할 때 합집합, 교집합, 차집합과 같은 집합 간의 연산을 배웠다. Set은 집합이다. 똑같이 사용할 수 있다. 합집합은 addAll(), 교집합은 retainAll(), 차집합은 removeAll() 이라는 함수를 각각 적용한다.

 

import java.util.HashSet;
import java.util.Iterator;

public class asgsdargafg {

	public static void main(String[] args) {
		HashSet<String> hs1 = new HashSet<String>();
		HashSet<String> hs2 = new HashSet<String>();
		HashSet<String> hs3 = new HashSet<String>();
		
		
		hs1.add("pear");
		hs1.add("apple");
		hs1.add("tomato");
		hs1.add("pear");
		
		hs2.add("apple");
		hs2.add("grapes");
		
		hs3.add("strawberry");
		hs3.add("grapes");
		hs3.add("pear");
		
		HashSet<String> union = new HashSet<String>(hs1);
		union.addAll(hs2);
		union.addAll(hs3); //hs1, hs2, hs3 모두 합한 합집합
		
		HashSet<String> intersection = new HashSet<String>(hs1);
		intersection.retainAll(hs2); //hs1와 hs2의 교집합
		
		HashSet<String> remove = new HashSet<String>(hs1);
		remove.removeAll(hs3); //hs1에서 hs3을 뺀 차집합
		
		System.out.println("합집합 " + union);
		System.out.println("교집합 " + intersection);
		System.out.println("차집합 " + remove);
	}
}
합집합 [apple, pear, strawberry, tomato, grapes]
교집합 [apple]
차집합 [apple, tomato]

 

 

- TreeSet(정렬이 된 상태로 저장)

import java.util.HashSet;
import java.util.TreeSet;

public class Main {

	public static void main(String[] args) {
		TreeSet<String> ts1 = new TreeSet<String>();
		TreeSet<String> ts2 = new TreeSet<String>();
		TreeSet<String> ts3 = new TreeSet<String>();
		
		ts1.add("pear");
		ts1.add("apple");
		ts1.add("tomato");
		ts1.add("pear");
		
		ts2.add("apple");
		ts2.add("grapes");
		
		ts3.add("strawberry");
		ts3.add("grapes");
		ts3.add("pear");
		
		System.out.println(ts1);
		System.out.println(ts2);
		System.out.println(ts3);
	}
}
[apple, pear, tomato]
[apple, grapes]
[grapes, pear, strawberry]

기존의 데이터를 TreeSet을 사용하여 출력해 보았다. 알파벳 순으로 정렬이 되어 데이터가 저장되어 있는 것을 확인할 수 있다.

 

 

- LinkedHashSet (입력된 순서대로 데이터 저장)

import java.util.LinkedHashSet;

public class Main {

	public static void main(String[] args) {
		LinkedHashSet<String> lhs1 = new LinkedHashSet<String>();
		LinkedHashSet<String> lhs2 = new LinkedHashSet<String>();
		LinkedHashSet<String> lhs3 = new LinkedHashSet<String>();
		
		lhs1.add("pear");
		lhs1.add("apple");
		lhs1.add("tomato");
		lhs1.add("pear");
		
		lhs2.add("apple");
		lhs2.add("grapes");
		
		lhs3.add("strawberry");
		lhs3.add("grapes");
		lhs3.add("pear");
		
		System.out.println(lhs1);
		System.out.println(lhs2);
		System.out.println(lhs3);
	}
}
[pear, apple, tomato]
[apple, grapes]
[strawberry, grapes, pear]

입력된 순서로 데이터가 저장된 것을 확인할 수 있다.

 

다음 글에서는 Set과 같이 Collection 인터페이스를 구현하는 Map인터페이스에 대해 포스팅할 예정이다.

그럼 이만.

반응형

+ Recent posts