40일 차 - Set<E>, HashCode함수, 해쉬 알고리즘 (23.02.21)

yvonne·2023년 2월 21일
0

📂Java

목록 보기
41/51
post-thumbnail

1. 아래와 같이 출력되도록 하시오.

HashSet<Person> hSet = new HashSet<Person>();
hSet.add(new Person("LEE", 10));
hSet.add(new Person("LEE", 10));
hSet.add(new Person("PARK", 35));
hSet.add(new Person("PARK", 35));

System.onut.println("저장된 데이터 수: " + hSet.size());
System.out.println(hSet);

/*
============
저장된 데이터 수: 2
[LEE(10세), PARK(35세)]
*/


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

class Person {
	private String name;
	private int age;

	public Person(String n, int a) {
		name = n;
		age = a;
	}

	@Override
	public String toString() {
		return name + "(" + age + "세)";
	}

	@Override
	public int hashCode() {
		return age % 3;		// 군집 생성을 위한 방 만드는 과정
	}

	@Override
	public boolean equals(Object obj) {
		if ((name.equals(((Person) obj).name)) && (age == (((Person) obj).age))) {		// 	동등비교 과정 , 중복값을 거르기 위한 과정
			return true;
		} else {
			return false;
		}
	}
}

public class setTest {

	public static void main(String[] args) {
		HashSet<Person> hSet = new HashSet<Person>();
		hSet.add(new Person("LEE", 10));
		hSet.add(new Person("LEE", 10));
		hSet.add(new Person("PARK", 35));
		hSet.add(new Person("PARK", 35));

		System.out.println("저장된 데이터 수: " + hSet.size());
		System.out.println(hSet);

//		
//		============
//		저장된 데이터 수: 2
//		[LEE(10세), PARK(35세)]

	}
}
  • 출력결과







2. Set 을 이용 하여, 로또 번호를 출력 하시오.

 public class collectionFramework4 {

	public static void main(String[] args) {
		Set<Integer> lotto = new HashSet<>();

		while (lotto.size() < 6) {
			int random = (int) ((Math.random() * 45) + 1);
			lotto.add(random);
		}
		System.out.println(lotto);

	}

}
  • 출력결과

  • 중복이 나오지 않는 이유: HashCode(); equals();가 Override 됐기 때문







3. 출력이 아래와 같이 나오도록 하시오⭐️

  HashSet<Num> set = new HashSet<>();
        set.add(new Num(7799));
        set.add(new Num(9955));
        set.add(new Num(7799));

        System.out.println("인스턴스 수: " + set.size());

        for(Num n : set)
            System.out.print(n.toString() + '\t');

        System.out.println();

/*
====출력
인스턴스 수: 2
7799	9955
*/

package wrap;

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

class Num3 {
	private int num;

	public Num3(int num) {
		this.num = num;
	}

	@Override
	public String toString() {
		return String.valueOf(num);		// num은 int형이기 때문에 valueOf 활용
	}

	@Override
	public int hashCode() {
		return num % 2; // 군집 생성을 위한 방 만드는 과정
	}

	@Override
	public boolean equals(Object obj) {
		if (num == ((Num3) obj).num) {
			return true;
		} else {
			return false;
		}
	}
}

public class setTest {

	public static void main(String[] args) {
		HashSet<Num3> set = new HashSet<>();
		set.add(new Num3(7799));
		set.add(new Num3(9955));
		set.add(new Num3(7799));

		System.out.println("인스턴스 수: " + set.size());

		for (Num3 n : set)
			System.out.print(n.toString() + '\t');

		System.out.println();

		/*
		 * ====출력 인스턴스 수: 2 7799 9955
		 */
	}
}
  • 출력결과







4. Set 호출되는 원리와 순서를 설명하시오.

  • set은 집합을 구현한 것으로 저장 순서가 유지되지 않고, 데이터의 중복 저장을 허용하지 않는다.
  • 이를 구현하기 위해서는 동일 인스턴스가 중복 저장되지 않도록 해야한다. 그러므로 set을 호출하기 위해서 다음 두 개가 호출되어야 한다는 것을 반드시 이해해야 한다.
  • 아래의 두 개가 다 같아야 동일 인스턴스이다.

💡 1. hash code 호출 (두 개 객체 주소-hash code가 같은지 비교)

  • hashCode 는 Object에 있다. 오버라이드 한 함수를 통과해 리턴 되는 값으로 군집(집합, 캐비넷)을 만든다. 그리고 그 다음 equals를 호출한다.

💡 2. equals 호출 (문자열 비교 걸러냄)

  • hash code의 호출로 군집히 형성되면 그 군집 내의 요소들을 비교해 나간다.

  • Set 호출에는 2단계를 거쳐 진행된다.

    • 클래스에 정의된 hashCode 메소드의 반환 값을 통해 분류.

    • 선택된 부류 내에서 equals 메소드를 호출하여 비교.

  • 따라서 Set은 hashCode를 기반으로 분류된 데이터 속에서 탐색을 하면 되기 때문에 탐색속도가 높다.

profile
개발 연습장

0개의 댓글