객체 비교(equals())
equals()는 모든 객체가 매개값으로 대입될 수 있다. 최상위 클래스인 Object 클래스가 가지고 있는 메서드이므로 모든 객체는 Object 타입으로 자동 타입변환이 될 수 있다.
Object 클래스의 equals() 메서드는 비교 연산자인 ==과 동일한 결과를 리턴한다. 두 객체가 논리적으로 동등하다는 것은 같은 객체이건 다른 객체이건 상관없이 객체가 저장하고 있는 데이터가 동일하다는 것을 의미한다. 예를들어 String 객체의 equals() 메서드는 String 객체의 번지를 비교하는 것이 아니고, 문자열이 동일한지를 조사해서 같으면 true, 그렇지 않으면 false를 리턴하는데, 이는 String 클래스에서 equals() 메서드를 재정의해서 문자열 비교로 변경했기 때문이다.
equals() 메서드를 오버라이딩 하기위해서는 먼저 비교하려는 객체가 동일한 타입인 객체인지 확인해주어야 한다. instanceof로 확인하여 true라면 캐스팅을 통해서 비교하도록 처리하면 된다.
public class Member {
public String id;
@Override
public boolean equals(Object o) {
if(o instanceof Member) {
Member member = (Member) o;
if(id.equals(member.id)) {
return true;
}
}
return false;
}
}
Member 객체의 equals() 메서드를 오버라이딩했다. 먼저 파라미터의 클래스가 Member 객체인지 확인하고, 캐스팅하여 id값이 서로 같을 경우 true를 반환하도록 오버라이딩 하였다. equals() 메서드는 hashCode() 메서드와 연관관계를 가지고 있어서 오버라이딩을 할 때 어떤 목적으로 사용해야하는지를 알아두어야 한다.
객체 해시코드(hashCode())
객체 해시코드란 객체를 식별하는 하나의 정수값을 말한다. Object의 hashCode() 메서드는 객체의 메모리 번지를 이용해서 해시코드를 만들어 리턴한다. 따라서 객체마다 다른 값을 가지고 있다.
논리적 동등 비교를 할 때 hashCode()를 오버라이딩할 필요성이 있다. HashSet, HashMap, HashTable에서 hashCode() 메서드를 실행해서 리턴된 해시코드 값이 같은지를 확인하기 때문이다. 기본적으로 해시코드 값이 서로 같은지를 hashCode() 메서드를 통해서 확인하고, 해시코드 값이 같을 경우에는 equals() 메서드를 통해서 한번 더 동등한 객체인지를 확인하게된다.
따라서 hashCode()값이 같더라도 equals()가 다르다면 두 객체는 다른 객체가 된다.
결론적으로, 객체의 동등비교를 위해서는 Object의 equals() 메서드만 오버라이딩하지말고 hashCode() 메서드도 오버라이딩해서 논리적 동등 객체일 경우에 동일한 해시코드가 리턴되도록 해야한다. 이렇게 처리하지 않을 경우에 해시코드를 사용하는 객체에서 key값이 다르게 인식되어 value가 null로 나오게되는 불상사가 발생될 수도 있기 때문이다.
'기술지식' 카테고리의 다른 글
[Mybatis] Spring에서 Mybatis 세팅방법, 사이클 정리 (0) | 2021.12.21 |
---|---|
[React] JSX, State 간단 정리 (0) | 2021.12.17 |
[React] 초기 세팅방법 정리 (0) | 2021.12.17 |
[해싱, 암호화] 데이터를 암호화하는 방법 (0) | 2021.12.01 |
[Git/GitHub] gitIgnore 사용방법, 이클립스로 pull하는 방법 (0) | 2021.11.21 |
댓글