728x90

들어가면서

Java에서 모든 객체는 기본적으로 Object 클래스를 상속하며, Object 클래스에는 equals()와 hashCode() 메서드가 정의되어 있습니다.

차이점

equals() 메서드는 객체의 동등성을 비교하고, hashCode() 메서드는 객체를 해시 테이블 등에 저장할 때 사용됩니다.

객체의 equals() 메서드를 오버라이딩하면, 두 객체의 동등성을 비교할 때 더욱 정확한 결과를 얻을 수 있습니다. equals() 메서드를 오버라이딩하지 않으면, 두 객체가 동일한 인스턴스인지만 비교하게 됩니다. 예를 들어, String 클래스의 경우, 문자열의 값이 같으면 두 String 객체는 동등한 것으로 간주됩니다. 하지만 String 객체의 equals() 메서드를 오버라이딩하지 않으면, 두 String 객체가 동등한지 여부를 확인하는 것이 불가능합니다.

hashCode() 메서드는 객체를 해시 테이블 등에 저장할 때 사용됩니다. 만약 두 객체가 equals() 메서드를 통해 동등하다면, 두 객체의 hashCode() 값도 동일해야 합니다. hashCode() 메서드를 오버라이딩하지 않으면, 객체의 메모리 주소를 기반으로 해시 코드가 생성됩니다. 하지만 같은 객체라도 프로그램의 실행 상황에 따라 메모리 주소가 달라질 수 있으므로, 이러한 방식으로 해시 코드를 생성하면 문제가 발생할 수 있습니다.

따라서, equals() 메서드와 hashCode() 메서드를 오버라이딩하여 객체의 동등성 비교와 해시 코드 생성을 정확하게 구현해야 합니다.

@equals와 @hashCode는 자바 어노테이션으로, 해당 메서드를 오버라이딩하겠다는 것을 나타냅니다. 이 어노테이션을 사용하면 개발자가 실수로 메서드를 오버라이딩하지 않는 경우를 방지할 수 있습니다.

객체의 equals() 메서드와 hashCode() 메서드를 오버라이딩하는 방법을 예시 코드로 보여드리겠습니다.

다음은 Student 클래스를 예시로 들어보겠습니다.

public class Student {
    private String name;
    private int age;
    private int studentId;

    // 생성자와 getter/setter 메서드는 생략

    @Override
    public boolean equals(Object obj) {
        if (obj == this) return true;
        if (!(obj instanceof Student)) return false;
        Student student = (Student) obj;
        return student.studentId == this.studentId;
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + studentId;
        return result;
    }
}

위 코드에서 equals() 메서드는 학생의 학번(studentId)을 비교하여 두 객체가 동등한지 여부를 판단하도록 구현되었습니다. 또한, hashCode() 메서드는 학번(studentId) 값을 사용하여 해시 코드를 생성하도록 구현되었습니다.

만약 equals() 메서드와 hashCode() 메서드를 오버라이딩하지 않았다면, 두 학생 객체가 동등한지 여부를 확인하는 것이 불가능했을 것입니다.

Student student1 = new Student("John", 20, 1001);
Student student2 = new Student("Alice", 22, 1001);
boolean isEqual = student1.equals(student2); // true

위 코드에서 student1과 student2는 이름과 나이는 다르지만 학번이 동일합니다. 따라서 equals() 메서드를 오버라이딩하여 학번이 같은 경우 동등하다는 것을 정의하면, 두 객체가 동등하다고 판단됩니다.

hashCode() 메서드를 오버라이딩하지 않으면, 객체의 메모리 주소를 기반으로 해시 코드가 생성됩니다. 하지만 같은 객체라도 프로그램의 실행 상황에 따라 메모리 주소가 달라질 수 있으므로, 이러한 방식으로 해시 코드를 생성하면 문제가 발생할 수 있습니다. 따라서 hashCode() 메서드를 오버라이딩하여 학번(studentId) 값을 사용하여 해시 코드를 생성하도록 구현합니다.

Map<Student, String> map = new HashMap<>();
map.put(student1, "John");
map.put(student2, "Alice");
System.out.println(map.get(student1)); // John
System.out.println(map.get(student2)); // Alice

위 코드에서는 HashMap을 사용하여 학생 객체와 문자열 데이터를 저장하였습니다. HashMap은 객체의 해시 코드를 기반으로 데이터를 저장하므로, hashCode() 메서드를 오버라이딩하여 해시 코드를 정확하게 생성하는 것이 중요합니다. 따라서 위 코드에서는 학번(studentId)을 사용하여 해시 코드를 생성하도록 구현하였습니다.

결론적으로…

equals()와 hashCode() 메서드를 오버라이딩하여 객체의 동등성 비교와 해시 코드 생성을 정확하게 구현해야 합니다. @equals와 @hashCode 어노테이션을 사용하면 오버라이딩을 보다 쉽게 구현할 수 있습니다.


내저장소 바로가기 luxury515

+ Recent posts