본문 바로가기
자바

Object Class

by 이상한나라의개발자 2023. 12. 11.

자바의 Object 클래스의 equals()와 hashCode() 메서드는 매우 중요한 메서드로, 객체의 동일성과 동등성을 다룰 때 주로 사용됩니다.

 

equals() 메서드

 

목적: 객체의 동등성(equality)을 확인합니다.

Object 클래스에서 기본으로 제공되는 equals() 메서드는 객체의 동일성(identity)을 검사합니다. 즉, 두 객체가 메모리 상에서 같은 주소를 가리키는지 확인합니다. 일반적으로, 우리는 객체의 속성 값을 기반으로 두 객체의 동등성을 확인하고자 할 때 equals() 메서드를 재정의(override) 합니다.

 

@Override
public boolean equals(Object obj) {
    if (this == obj)
        return true;
    if (obj == null || getClass() != obj.getClass())
        return false;
    MyClass other = (MyClass) obj;
    return attribute1.equals(other.attribute1) && attribute2.equals(other.attribute2);
}

 

hasCode() 메서드 

 

객체의 해시 코드 값을 반환합니다. 해시 코드는 객체를 식별하기 위한 정수 값입니다. Object 클래스에서 기본으로 제공되는 hashCode() 메서드는 객체의 메모리 주소를 기반으로 해시 코드를 반환합니다.

 

두 객체가 equals() 메서드를 통해 동등하다고 판정된다면, 두 객체의 hashCode() 메서드가 반환하는 값도 동등해야 합니다.

hashCode()가 동일한 값을 반환한다고 해서 두 객체가 equals()로 동등하다는 것을 보장하지는 않습니다. 하지만 반대는 보장되어야 합니다. equals() 메서드를 재정의하는 경우, hashCode() 메서드도 재정의해야 합니다.

 

@Override
public int hashCode() {
    int result = 17; // 초기 prime number
    result = 31 * result + attribute1.hashCode();
    result = 31 * result + attribute2.hashCode();
    return result;
}

 

 

equals() hashCode() 메서드는 객체의 동등성과 동일성을 다룰 때 중요합니다. equals() 메서드를 재정의하면 hashCode() 메서드도 함께 재정의해야 합니다. 이렇게 함으로써, 객체를 저장하거나 검색할 때 동작하는 자료 구조(예: HashMap, HashSet 등)의 정상적인 동작을 보장할 수 있습니다.

 

 

HashMap 또는 HashSet에 객체를 저장할 때, 해당 객체의 hashCode() 메서드가 호출됩니다. 이 해시 코드를 사용하여 객체가 저장될 버킷의 위치를 결정합니다.

 

검색 과정: HashMap 또는 HashSet에서 객체를 검색하거나 접근할 때, 다시 해당 객체의 hashCode() 메서드가 호출됩니다. 이 해시 코드를 통해 빠르게 해당 객체의 버킷 위치를 찾아내고, 그 다음 equals()를 사용하여 정확한 객체를 찾습니다.

 

중복 검사: HashSet에 객체를 추가할 때 먼저 해당 객체의 hashCode() 값으로 버킷 위치를 찾고, 그 위치에 동등한 객체가 이미 있는지 equals()로 검사합니다.

 

아래는 hascode()가 오버라이딩 되고 안되고의 차이를 설명 합니다.

hascode()를 오버라이딩 하지 않았을 경우에는 set 객체에 2개의 데이터가 저장되며, 오버라이딩 하게 되면 1개의 데이터가 저장되게 됩니다.

 

public class HashCodeExampleMain {
    public static void main(String[] args) {
        // Hash 관련 컬렉션이 같은 인스턴스를 구분하는 방법
        // hashCode 비교 -> equals 비교
        
        SomeObject sameObject1 = new SomeObject(1, "someobject");
        SomeObject sameObject2 = new SomeObject(1, "someobject");

        System.out.println(sameObject1.hashCode());
        System.out.println(sameObject2.hashCode());

        Set<SomeObject> set = new HashSet<>();

        set.add(sameObject1);
        set.add(sameObject2);

        System.out.println(set.size());
    }
}

 

 

public class SomeObject {
    private int intField;
    private String stringField;

    public SomeObject(int intField, String stringField) {
        this.intField = intField;
        this.stringField = stringField;
    }

    public int getIntField() {
        return intField;
    }

    public String getStringField() {
        return stringField;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        SomeObject that = (SomeObject) o;
        return intField == that.intField && Objects.equals(stringField, that.stringField);
    }

    // hashCode가 오버라이딩 되고 안되고의 차이
    @Override
    public int hashCode() {
        return Objects.hash(intField, stringField);
    }
}

'자바' 카테고리의 다른 글

if문 제거하기  (0) 2023.12.12
Java Optional  (0) 2023.12.12
예외  (0) 2023.12.11
캡슐화  (0) 2023.12.11
추상클래스와 인터페이스  (0) 2023.12.11