Set의 특성 2가지만 숙지
1. 객체의 중복을 허용하지 않음
2. Set 내에서의 순서가 없다.
Set은 객체의 중복을 허용하지 않는다.
하지만 아래의 코드를 실행했을 때 결과는 보자
public class Test {
public static void main(String[] args) {
HashSet set = new HashSet();
Person p1 = new Person("David", 10);
Person p2 = new Person("David", 10);
set.add("abc");
set.add(p1); //set.add(new Person("David", 10);
set.add(p2); //set.add(new Person("David", 10);
p1.equals(p2);
System.out.println("set = " + set);
}
}
class Person{
String name;
int age;
Person(String name, int age){
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
실행결과
Set은 객체의 중복을 허용하지 않는데, 안타깝게도 자바 조상님께서 실수를 하신 것 같다.
HashSet의 add메서드는 새로운 요소를 추가하기 전에 기존의 저장된 요소와 같은 것인지 판별하기 위해
equals()와 hashCode()를을 호출한다.
(코드에 눈을 비비고 찾아보아도 add(equals())나 add(hashCode())가 없다. 그럼에도 불구하고
조상님께서 내부적으로 add메서드 호출시 equals메서드와 hashCode를 호출한다고 생각하자 눈으로 안보이지만
그렇게 생각하자)
방금 전 자바조상님께서 실수를 하신 것 같다고 언급하였다. 그러나
좀 더 정확하게 이야기 하자면, 자바 조상님께서는 Integer, Chracter, Float, Boolean 과 같은 객체자료형에 대해서는
잘 알고 계시지만,
내가 만든 참조자료형(Person객체)에 대해서는 모르신다.
이제 그럼 equals메서드와 hashCode를 오버라이딩하여 두 객체가 동일객체라는 사실을 자바조상님(여기서는 set의 add함수)에게 인식시켜 주자
public class Test {
public static void main(String[] args) {
HashSet set = new HashSet();
Person p1 = new Person("David", 10);
Person p2 = new Person("David", 10);
set.add("abc");
set.add(p1); //set.add(new Person("David", 10);
set.add(p2); //set.add(new Person("David", 10);
p1.equals(p2);
System.out.println("set = " + set);
}
}
class Person{
String name;
int age;
Person(String name, int age){
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
@Override
public boolean equals(Object obj) {
if(!(obj instanceof Person)) return false;
Person p = (Person)obj;
return this.name.equals(p.name) && this.age == p.age;
}
@Override
public int hashCode() {
return Objects.hash(name, age);
}
}
실행결과
equals메서드와 hashCode를 오버라이딩 해준 결과 이름과 나이가 동일한Person객체를 동일객체로 인식하여
하나의 객체만 set에 저장하였음을 보여준다.
결론 :
사용자정의 객체(클래스)의 경우 적절하게 equals메서드와 hashCode메서드를 오버라이딩 해줘야 동일한 객체를
하나의 객체로 인식한다.
참고: 사용자정의 객체는 글쓴이가 만든 Person객체(클래스)를 의미함
'자바 > Java (중요하고, 이해 안 되고, 어려운)' 카테고리의 다른 글
Comparable (0) | 2022.10.27 |
---|---|
생성자 (0) | 2022.10.26 |
객체변수와 객체 (0) | 2022.10.26 |
자바 - 익명클래스★★ (0) | 2022.10.26 |
자바에서의 this (0) | 2022.10.26 |