본문 바로가기

자바

[Java] equals 와 hashCode - 객체 일 경우

728x90

 

/* equals와 hashCode*/

Java의 모든 객체는 equals와 hashCode 함수를 상속받고 있다.

 

/* equals*/

equals는 두 객체가 동등한지 비교한다.

String s1 = "Hello";
String s2 = "Hello";

System.out.println(s1 == s2); //false 메모리 주소 비교
System.out.println(s1.equals(s2)); //true 값 비교

/*equals - 객체일 경우*/

Person person1 = new Person("Person1",20); //Person(String name,int age)
Person person2 = new Person("Person1",20);

System.out.println(person1.equals(person2)); //false. 객체타입인 경우 메모리 주소값 비교

 

equals 의 인자가 객체일 경우 메모리 주소 값을 비교하니 false가 뜬다.

하지만 equals 를 true로 만들고 싶다면? equals 메서드를 오버라이딩하면 된다.

 

class Person {
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        Person person = (Person) o;

        if (age != person.age) return false;
        return name != null ? name.equals(person.name) : person.name == null;
    }
 }

 

/*hashCode*/

hashCode 메서드는 객체의 해시코드 값을 반환한다. 

만약, HashMap, HashSet에서 equals() 메서드를 오버라이드 하는 경우, 동등한 객체는 같은 해시코드를 가져야 한다.

따라서 hashCode() 메서드도 함께 오버라이드한다.

hashCode() 메서드 변경을 하지 않으면 equals가 true인 두 객체를 add, (or put)을 하면 컬렉션에 잘 넣어진다.

이를 고쳐야 해서 hashCode() 오버라이드를 한다.

 

/*hashCode - 객체*/

    @Override
    public int hashCode() {
        int result = name != null ? name.hashCode() : 0;
        result = 31 * result + age;
        return result;
    }

 

위 예시와 같이 작성해봤다

 

/*identityHashCode*/

이 상황에서 객체 자체의 주소값 (해시코드) 을 알고 싶다면?

 

System.identityHashCode(person1);

 

이런 식으로 이용하면 된다.

728x90