들어가면서
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
'Back-end > 기타' 카테고리의 다른 글
tomcat m1 설정 (0) | 2023.04.13 |
---|---|
IPv6 와 IPv4 를 비교했을때 장점은 뭐지? (0) | 2023.04.13 |
Optional 클래스(2) : ispresent() vs ifpresent() 차이 (0) | 2023.04.11 |
Optional 클래스(3) : orElse()와 orElseGet() 차이 (0) | 2023.04.11 |
AI는 과연 어디까지 선을 넘을까? (0) | 2022.12.13 |