고급자바

김강산·2022년 7월 25일
0

고급JAVA

목록 보기
5/15

HashSet

package kr.or.ddit.basic;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;

public class T05HashSetTest {
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 isAdded = hs1.add("FF");
	System.out.println("중복되지 않을 때 : " + isAdded);
	System.out.println("Set 데이터 : " + hs1);
	System.out.println();
	
	isAdded = hs1.add("CC");
	System.out.println("중복될 때 : " + isAdded);
	System.out.println("Set 데이터 : " + hs1);
	System.out.println();
	
	// Set의데이터를 수정하려면 수정하는 명령이 따로 없기 때문에 해당 자료를 삭제한 후
	// 새로운 데이터를 추가해 주어야 한다.
	
	// 삭제하는 메서드
	// 1) clear() => Set데이터 전체 삭제
	// 2) remove(삭제할자료) => 해당자료 삭제
	
	// 예) 'FF'를 'EE'로 수정하기
	hs1.remove("FF");
	System.out.println("삭제 후 Set 데이터 : " + hs1);
	System.out.println();
	
	hs1.add("EE");
	System.out.println("Set 데이터 : " + hs1);
	
	hs1.clear(); // 전체자료 삭제
	
	System.out.println("Set의 자료 개수 : " + hs1.size());
	System.out.println();
	
	// Set은 데이터의 순서가 없기 때문에 List처럼 인덱스로 데이터를 하나씩 불러올 수
	// 없다. 그래서 데이터를 하나씩 얻기 위해서는 Iterator를 이용해야 한다.
	
	// Set의 데이터를 접근하기 위한 Iterator 객체 가져오기
	Iterator it = hs1.iterator();
	
	// 데이터 개수만큼 반복하기
	// hashNext() => 포인터 다음 위치에 데이터가 있으면 true, 없으면 false를
	//								반환한다.
	while(it.hasNext()) { // 다음 자료가 있는지 검사
		// next() => 포인터를 다음 자료 위치로 이동하고 이동한 위치의 자료를
		//					  반환한다.
		System.out.println(it.next());
	}
	
	// 1~100사이의 중복되지 않는 정수 5개 만들기
	Set<Integer> intRnd = new HashSet<Integer>();
	
	while(intRnd.size() < 5) {
		int num = (int) (Math.random() * 100 + 1);
		
		intRnd.add(num);
	}
	
	System.out.println("만들어진 난수들 : " + intRnd);
	
	// Collection유형의 객체들은 서로다른 자료 구조로 쉽게 변경해서 사용할 수 있다.
	// 다른 종류의 객체를 생성할 때 생성자에 변경할 데이터를 넣어주면 된다.
	List<Integer> intRndList = new ArrayList<Integer>(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 + " ");
	}
}

}

Tree Set

package kr.or.ddit.basic;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.SortedSet;
import java.util.TreeSet;

public class T06TreeSetTest {
public static void main(String[] args) {

	TreeSet<String> ts = new TreeSet<String>();
	
	List<String> abcList = new ArrayList<String>();
	
	// 영어 대문자를 문자열로 변환하여 List에 저장하기
	for(char ch = 'A'; ch <='Z'; ch++) {
		String temp = String.valueOf(ch);
		abcList.add(temp);
	}
	
	System.out.println("abcList 자료(섞기전) : " + abcList);
	
	Collections.shuffle(abcList);
	
	System.out.println("abcList 자료(섞은후) : " + abcList);
	
	for(String str : abcList) {
		ts.add(str);
	}
	System.out.println("TreeSet 자료 : " + ts);
	
	// TreeSet에 저장된 자료중 특정한 자료보다 작은 자료를 찾아서 SortedSet으로 
	// 반환하는 메서드가 있다.
	// => haadSet(기준값) : 기본적으로 '기준값'은 포함시키지 않는다.
	// => headSet(기준값, 논리값) : 논리값이 true이면 '기준값'을 포함시킨다.
	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) : 각 값을 기준으로 포함여부 설정 
	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", true, "N", false));
	System.out.println("K(미포함)부터 N(포함)까지 : "
						+ ts.subSet("K", false, "N", true));
}

}

EqualsHashCode

package kr.or.ddit.basic;

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

public class T07EqualsHashcodeTest {
/*
해시함수(hash function)는 임의의 길이의 데이터를 고정된 길이의 데이터로 매핑하는 함수이다.
해시함수에 의해 얻어지는 값은 해시값, 해시코드, 해시체크섬 또는 간단하게 해시라고 한다.

HashSet, HashMap, Hashtable과 같은 객체들을 사용할 경우,
객체가 서로 같은지를 비교하기 위해 equals()메서드와 hashCode()메서드를 호출한다.
그래서 객체가 서로 같은지 여부를 결정하려면 두 메서드를 재정의 해야 한다.
객체가 같은지 여부는 데이터를 추가할 때 검사한다.

 - equals()메서드와 hashCode()메서드에 관련된 규칙
 1. 두 객체가 같으면 반드시 같은 hashCode를 가져야 한다.
 2. 두 객체가 같으면 equals()호출했을때 true를 반환해야 한다.
  즉, 객체 a, b가 같다면 a.equals(b)와 b.equals(a) 둘다 true이어야 한다.
  3. 두 객체의 hashCode가 같다고 해서 두 객체가 반드시 같은 객체는 아니다.
   하지만 두 객체가 같으면 반드시 hashCode가 같아야 한다.
  4. equals()메서드를 override하면 반드시 hashCode()도 override해야 한다.
  5. hashCode()는 기본적으로Heap메모리에 있는 각 객체에 대한 메모리 주소 매핑정보를
   기반으로 한 정수값을 반환한다.
   그러므로, 클래스에서 hashCode()메서드를 override하지 않으면 절대로 두 객체가 같은 
   것으로 간주될 수 없다.

*/
public static void main(String[] args) {

	Person p1 = new Person(1, "홍길동");
	Person p2 = new Person(1, "홍길동");
	Person p3 = new Person(1, "이순신");
	
	//override를 사용했기 때문에 같은 주소값이 나옴

// System.out.println("홍길동1".hashCode());
// System.out.println("홍길동1".hashCode());

	System.out.println("p1.equals(p2) : " + p1.equals(p2));
	System.out.println("p1 == p2 : " + (p1 == p2));
	
	Set<Person> set = new HashSet<Person>();
	
	set.add(p1);
	set.add(p2);
	System.out.println("p1, p2등록 후 데이터 : ");
	
	// for문 말고도 이것도 사용가능하다

// Iterator iter = set.iterator();
// while(iter.hasNext()) {
// Person p = iter.next();
// System.out.println(p.getId() + " : " + p.getName());
// }

	for(Person p : set) {
		System.out.println(p.getId() + " : " + p.getName());
	}
	// 중복이 안되서 add가능
	System.out.println("add(p3) 성공여부 : " + set.add(p3));
	System.out.println("add(p3) 등록 후 데이터 : ");
	
	for(Person p : set) {
		System.out.println(p.getId() + " : " + p.getName());
	}
	
	System.out.println("remove(p2) 성공여부 : " + set.remove(p2));
	System.out.println("remove(p2) 후 데이터 : ");
	
	for(Person p : set) {
		System.out.println(p.getId() + " : " + p.getName());
	}
}

}

class Person {

private int id;
private String name;

public Person(int id, String name) {
	super();
	this.id = id;
	this.name = name;
}
public int getId() {
	return id;
}
public void setId(int id) {
	this.id = id;
}
public String getName() {
	return name;
}
public void setName(String name) {
	this.name = name;
}
@Override
public String toString() {
	return "Person [id=" + id + ", name=" + name + "]";
}
// hashCode를 override를 하면 주소값이 같아진다

// @Override
// public int hashCode() {
// return (name + id).hashCode();
// }
//
//equals도 override를 해줘야 중복 체크가 된다
// @Override
// public boolean equals(Object obj) {
// Person p = (Person) obj;
// return this.getId() == p.getId()
// && this.getName().equals(p.getName());
// }
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime result + id;
result = prime
result + ((name == null) ? 0 : name.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Person other = (Person) obj;
if (id != other.id)
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}

}

0개의 댓글