IT/java

class 생성시, equals() hashCode() 오버라이딩!

토희 2022. 8. 7. 00:15
728x90

 

 

HashSet 예로 들어 들어, equals(), hashCode() 오버라이딩에 대한 설명해보려고 한다.

Set은 순서가 없고, 중복을 허용하지 않기 때문에, 기본적으로 중복된 데이터는 허용하지 않는다.

 

그러나 객체가 들어갈경우, 같은 데이터로 인식을 못하게 된다.

그래서 equals(), hashcode()의 오버라이딩이 필요하다!

 

// HashSet의 equals hashcode 오버라이딩
public class HashSetEx {

	public static void main(String[] args) {
		HashSet set = new HashSet();
		
		set.add("abc"); 
		set.add("abc");
		set.add(new Person("David", 10));
		set.add(new Person("David", 10));
		
		System.out.println(set);
	}
}

class Person{
	String name;
	int age;
	
	Person(String name, int age){
		this.name = name;
		this.age = age;
	}
	public String toString() {
		return name + ":" + age;
	}
}

 

위의 코드를 출력하면 밑에 처럼 출려된다.

"abc"를 add한 값은 중복으로 한 번만 출력되지만 

Person객체는 두개 출력되는 걸 알 수있다.

 

 

이런 문제를 방지하기 위해,  class를 생성할때 equals(), hashcode()를 오버라이딩 해줘야 한다.

이클립스 Source → Generate hashCode() and equals()

Generate

 

아래와 같이 자동 생성! 

그리고 나서 출력하면, 중복된 데이터가 제거된다

 

 

+ 이클립스에서 제공되는 소스를 좀 더 간결하게 오버라이딩 하면,

equals() 부분

이렇게 할수 있다.

 

 

밑에 전체 코드

import java.util.HashSet;
import java.util.Objects;

// HashSet의 equals hashcod 오버라이딩
public class HashSetEx {

	public static void main(String[] args) {
		HashSet set = new HashSet();
		
		set.add("abc"); 
		set.add("abc"); // 중복이라 저장안됨
		set.add(new Person("David", 10));
		set.add(new Person("David", 10));
		
		System.out.println(set);
	}
}

// equals()와 hashCode()를 오버라이딩해야 HashSet이 바르게 동작
// class를 만들때는 위의 두개를 항상 오버라이딩 하는게 정석
class Person{
	String name;
	int age;
	
	@Override
	public int hashCode() {
		// int hash(Object ... values); // 가변인자
		return Objects.hash(age, name); //iv들을 다 적으면 된다
 	}
	@Override
	public boolean equals(Object obj) {
		if(!(obj instanceof Person)) return false;
		
		Person p = (Person)obj; //obj에는 name과 age가 없기 때문에 형변환 필요
		
		// 나 자신(this)의 이름과 나이를 p와 비교
		return this.name.equals(p.name) && this.age == p.age;
	}
	
	Person(String name, int age){
		this.name = name;
		this.age = age;
	}
	public String toString() {
		return name + ":" + age;
	}
}

HashSet이 정상적으로 작동!

 

class를 생성할때, equals() hashcode() 오버라이딩 해주자!

728x90