40일차 - 2023.2.21

문우림·2023년 2월 21일
0

Java

목록 보기
22/23

1. Set< E >

  • Set인터페이스는 저장 순서가 유지되지 않는다.
  • 인덱스를 검색해서 가져오는 get(index)메소드가 없다.
  • 객체를 중복해서 저장할 수 없고, 하나의 중복 저장이 안 되기에 null값도 하나만 저장할 수 있다.
  • 수학적 집합에 비유된다.(순서 상관없이 중복이 허용되지 않아서)

1-1. HashSet클래스

Set인터페이스를 구현 클래스이다.
Set의 특징을 그대로 상속받음.(객체 중복이 안되고 저장 순서가 유지 되지 않음)

1-2. 중복을 걸러내는 과정

📌hashCode() 메소드

➀HashSet은 객체를 저장하기 전에 먼저 객체의 hashCode()메소드를 호출해서 해시 코드를 얻어낸다.
➁저장되어 있는 객체들의 해시 코드와 비교.
➂같은 해쉬 코드가 있다면 다시 equals()메소드로 두 객체 비교.
➃true이면 동일한 객체로 판단하고 중복을 저장을 하지 않는다.

equals()메소드 사용(중복 확인)

import java.util.HashSet;

class Num {
	private int num;

	public Num(int n) {
		num = n;
	}

	@Override
	public String toString() {
		return String.valueOf(num);
	}

	@Override
	public int hashCode() {
		return num % 3;
	}

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

public class Test1 {

	public static void main(String[] args) {
		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
9955	7799	
  • equals()메소드를 사용하여 인스턴스의 주소값을 비교해서, 같은 주소값(7799)은 제거되어, 인스턴스 수는 2개.

equals()메소드 제거한 위의 예제

import java.util.HashSet;

class Num {
	private int num;

	public Num(int n) {
		num = n;
	}

	@Override
	public String toString() {
		return String.valueOf(num);
	}

	@Override
	public int hashCode() {
		return num % 3;
	}

}

public class Test1 {

	public static void main(String[] args) {
		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();
	}

}

[결과]
인스턴스 수: 3
9955	7799	7799
  • 인스턴스가 3개 생성되어, 7799의 주소값은 같지만 서로 다른 인스턴스이기 때문에 인스턴스 수는 3개.

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

HashSet hSet = new HashSet();
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;

class Person {
	private String name;
	private int age;

	public Person(String name, int age) {
		this.name = name;
		this.age = age;
	}
	@Override
	public int hashCode() {
		return age % 100;
	}
	@Override
	public boolean equals(Object obj) {
		if (toString().equals(((Person) obj).toString())) {
			return true;
		} else {
			return false;
		}
	}
	@Override
	public String toString() {
		return name + "(" + age + "세 )";
	}
}

public class Test2 {

	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세)]
	}

}

0개의 댓글