1 . hashcode , equals란 ?
hashCode와 equals 메소드는 자바의 모든 클래스들의 부모 클래스인 Object 클래스에 정의되어 있기 때문에
메소드를 상속받고 있다.
그러므로 hashcode와 equals 메소드를 재정의 할 수 있다.
equals()에 대해
equals() 메소드의 리턴타입은 boolean 이고 , 기본적으로 2개의 객체가 동일한지 검사하기 위해 사용된다.
2개의 객체가 참조하는것이 동일한지를 확인하는 것이며 , 이는 동일성(Identity)을 비교하는 것이다.
즉, 2개의 객체가 가리키는 곳이 동일한 메모리 주소일 경우에만 동일한 객체가 된다.
하지만 동일한 객체가 메모리 상에 여러개 띄워져있을 경우 해당 객체는 서로 다른 메모리에 띄워져 있을경우
동일한 객체가 아니게되는데 프로그래밍 상으로는 같은 값이기 때문에 같은 객체로 인식되어야 하는데
이러한 동등성(Equality)을 위해 equals() 메소드를 오버라이딩(재정의)해주는 것이다.
Map<Long, StudentDTO> studentMap = new HashMap<>();
StudentDTO s1 = new StudentDTO();
s1.setId(1L);
s1.setStudentNumber("1111");
s1.setStudentName("김자바");
s1.setStudentMajor("컴퓨터공학");
s1.setStudentMoblie("010-1111-1111");
studentMap.put(s1.getId(), s1);
StudentDTO s5 = new StudentDTO();
s5.setId(1L);
s5.setStudentNumber("1111");
s5.setStudentName("김자바");
s5.setStudentMajor("컴퓨터공학");
s5.setStudentMoblie("010-1111-1111");
studentMap.put(s5.getId(), s5);
System.out.println(s5.equals(s1)); //false
System.out.println(s5.getStudentName().equals(s1.getStudentName())); // true
같은 객체에 같은 정보를 넣었음에도 s5.equals(s1))의 값은 false가 나온다.
하지만 get 메소드를 이용해 값을 비교하면 true이다.
여기서 DTO 클래스에 hashCode , equals 메소드를 재정의 한다면 false 값이 true가 나오게 된다.
@Override
public int hashCode() {
return Objects.hash(id, studentMajor, studentMoblie, studentName, studentNumber);
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
StudentDTO other = (StudentDTO) obj;
return Objects.equals(id, other.id) && Objects.equals(studentMajor, other.studentMajor)
&& Objects.equals(studentMoblie, other.studentMoblie) && Objects.equals(studentName, other.studentName)
&& Objects.equals(studentNumber, other.studentNumber);
}
hashCode와 equals 메소드를 재정의하는것은 둘이서 짝이라고 볼 수 있다.
즉 , 두 객체의 필드값이 모두 일치하는지 판단하려면 반드시 hashCode() , equals() 메소드를 재정의해야한다.
'Java > Java icia 16일차' 카테고리의 다른 글
Map을 이용해서 게시판 수정하기 (0) | 2023.03.15 |
---|---|
Java Map을 Key값 , Value값으로 정렬하기 (0) | 2023.03.15 |