고급자바 - JCF(Java Collection Framework) 2, Set 인터페이스

hkjs96·2020년 9월 15일
0

고급자바

목록 보기
2/3

복습
ArrayList의 장점, 단점

  • 데이터 접근용이
  • 많은 데이터가 있을씨 삽입, 삭제시 많은 작업을 해야함.

LinkedList 장점, 단점

  • 삽입/삭제가 용이
  • 데이터 접근이 어려움

Set Interface 특징

(1) 순서(인덱스)가 유지되지 않는 데이터의 집합이다.
(2) 데이터 중복을 허용하지 않는다.

Set Interface를 구현하고 있는 클래스

  • SortedSet, TreeSet, HashSet
 public static void main(String[] args) {
		Set hs1 = new HashSet<>();
		
		// Set에 데이터를 추가할 때 add()메서드를 사용한다.
		hs1.add("DD");
		hs1.add("AA");
		hs1.add(2);
		hs1.add("CC");
		hs1.add("BB");
		hs1.add(1);
		hs1.add(3);
		
		System.out.println("Set 데이터 : " + hs1);
		System.out.println();
		
		// Set은 데이터의 순서가 없고, 중복을 허용하지 않는다.
		// 그래서 이미 있는 데이터를 add하면 false를 반환하고, 데이터는 추가되지 않는다.
		boolean isAdd = hs1.add("FF");
		//중복을 허용하지 않기 때문에 잘들어갔나 확인하기 위해서 boolean 값을 리턴해준다.
		System.out.println("중복 되지 않을 때 : " + isAdd);
		System.out.println("Set 데이터 : " + hs1);
		System.out.println();
		
		isAdd = hs1.add("CC");
		System.out.println("중복 될 때 : " + isAdd);
		System.out.println("Set 데이터 : " + hs1);
		System.out.println();
		
		//Set의 데이터를 수정하려면 수정하는 명령이 따로 없기 때문에 해당 자료를
		// 삭제한 후 새로운 데이터를 추가해 주어야한다.
		
		// 삭제하는 메서드
		// 1) clear() => Set 데이터 전체 삭제
		// 2) remove(삭제할 자료) => 해당 자료 삭제
		// 예) 'FF'를 'EE'로 수정하기
		hs1.remove("FF"); // FF자료삭제
		System.out.println("삭제 후 데이터 : "+ hs1);
		System.out.println();
		
		hs1.add("EE"); // EE 자료 추가
		System.out.println("Set 데이터 : "+ hs1);
		System.out.println();
		
		// hs1.clear(); // 전체 자료 삭제
		//System.out.println("clear 후 Set 데이터 : "+ hs1);
		System.out.println("Set의 자료 개수 : " + hs1.size());
		System.out.println();
		
		// Set은 데이터의 순서가 없기 때문에 List처럼 인덱스로 데이터를 하나씩
		// 불러올 수 없다. 그래서, 데이터를 하나씩 가져오기 위해서는 Iterator로
		// 처리해야 한다.
		
		// Set의 데이터를 가져오기 위한 iterator 객체를 얻어오기
		// => Set의 iterator() 메서드를 호출하면 된다.
		Iterator it = hs1.iterator();
		
		// Iterator는 hasNext(),Next()메서드를 가지는 인터페이스임 
		// 뭔가 오라클 커서(cursor)같은 느낌이네
		
		// 데이터 개수 만큼 반복하기
		// hasNext()메서드 => 포인터 다음 위치에 데이터가 있으면 true,
		//					없으면 false를 반환한다.
		while(it.hasNext()) { // 다음 자료가 있는지 검사...
			// next()메서드 => 포인터를 다음 자료위치로 이동하고, 이동한
			// 				  위치로 자료를 반환한다.
			System.out.println(it.next());
		}
		
		//향상된 for문 for-each문 이전에는 Iterator를 이용해서 하나씩 불러왔었다.
		System.out.println("향상된 for문:");
		for(Object obj : hs1) {
			System.out.print(" "+obj);
		}
		System.out.println();
		
		
		// 1 ~ 100 사이의 중복되지 않는 정수 5개 만들기
		Set<Integer> intRnd = new HashSet<>();
		
		while(intRnd.size() < 5) { // Set의 데이터가 5개가 될때까지...
			int num = (int)(Math.random() * 100 + 1);
			intRnd.add(num);
		}
		
		System.out.println("만들어진 난수들 : " + intRnd);
		
		// Collection 유형의 객체들은 서로 다른 자료 구조로 쉽게 변경해서 사용할 수 있다.
		//  다른 종류의 객체를 생성할 때 생성자에 변경할 데이터를 넣어주면 된다.
		List<Integer> intRndList = new ArrayList<>(intRnd);
		System.out.println("List의 자료 출력...");
		for(int i = 0 ; i < intRndList.size() ; i++) {
			System.out.println(intRndList.get(i));
		}
		for(Integer num : intRndList) {
			System.out.print(num + " ");
		}
	}

/**

  • TreeSet 예제
    • 검색에 좀 더 최적화 되어있다.
      */
public static void main(String[] args) {
	// HashSet은 데이터 순서가 없으나(등록되는 순서를 알지 못함.)
	// TreeSet은 자동정렬 기능이 들어가 있다.
	// => 검색에 좀 더 최적화 되어있다.
	
	TreeSet<String> ts = new TreeSet<>();
	
	// 영어 대문자를 문자열로 변환하여 TreeSet에 저장하기
	for(char ch='Z'; ch>='A'; ch--) {
		String temp = String.valueOf(ch);
		ts.add(temp);
	}
		
	System.out.println("TreeSet 자료 : " + ts);
	
	// TreeSet에 저장된 자료 중 특정한 자료보다 작은 자료를 찾아서
	// SortedSet으로 반환하는 메서드가 있다.
	// => headSet(기준값) : 기본적으로 '기준값'은 포함 시키지 않는다.
	// => headSet(기준값, 논리값) : 논리값이 ture이면 '기준값' 포함.
	SortedSet<String> ss1 = ts.headSet("K");
	System.out.println("K 이전 자료 : "+ ss1); // 기준값 미포함
	System.out.println("K 이전 자료(기준값 포함) : 
    		"+ ts.headSet("K", true)); 		
		
	// '기준값' 보다 큰 자료를 찾아 SortedSet으로 반환하는 메서드.
	// tailSet(기준값) : 기본적으로 '기준값은' 포함한다.
	// tailSet(기준값, 논리값) : 논리값이 false면 '기준값' 포함하지 않음.
	SortedSet<String> ss2 = ts.tailSet("K");
	System.out.println("K 이후 자료 : " + ss2); // 기준값 포함
	System.out.println("K 이후 자료(기준값 미포함) : 
    		" + ts.tailSet("K", false));
		
	// subSet(기준값1, 기준값2) : 기준값1~기준값2 사이의 값을 가져옴
	// 						 ('기준값1' 포함, '기준값2' 미포함);
	// subSet(기준값1, 논리값1, 기준값2, 논리값2) : 
	//  각 기준값의 포함 여부를 설정한다.(논리값이 true이면 포함.)
	System.out.println("K(포함)부터 N(미포함)까지 : " 
    		+ ts.subSet("K", "N"));
	System.out.println("K(포함) ~ N(포함) : " 
    		+ ts.subSet("K", true, "N", true));
	System.out.println("K(미포함) ~ N(미포함) : " 
    		+ ts.subSet("K", false, "N", false));
	System.out.println("K(미포함) ~ N(포함) : " 
	    	+ ts.subSet("K", false, "N", true));
}

0개의 댓글