본문 바로가기

JAVA

Collection 중복체크 - equals(), hashCode()

Collections

Collection 인터페이스는 모든 클래스들의 Object를 element로 저장하는 객체의 최상위 Interface 이다.

 

예를 들어, Collection에서 객체를 삭제하는 경우 Object Class의 equals()는 주소값을 비교하기 때문에 동일한 정보를 가진 객체를 서로 다른 객체로 판단하여 False를 반환한다. 하지만, 객체의 주소값을 비교하는것이 아닌 객체의 실제 값들을 비교하고 싶을때 equals()를 재정의하여 사용해야한다.

 

/* 객체 p3와 p4를 동일하게 생성하고 p4를 삭제해보면 삭제가 되지 않는다*/

// 새로운 환자 등록
Patient p3 = new Patient("환자3", 33, "010-3333-3333", "고열", "001", false);

// p3 과 동일정보의 환자로 p3 삭제 시도
Patient p4 = new Patient("환자3", 33, "010-3333-3333", "고열", "001", false);
univHospital.removePatient(p4);

 

- equals() override 사용 이유 : 주소값이 서로 다르더라도 논리적으로 동일한 객체임을 비교할 필요할때 사용한다

아래와 같이 Patient 클래스의 equals()를 재정의하면 삭제되는것을 확인할수있다.

@Override
public boolean equals(Object o) {
  Patient p = (Patient)o;
  if( this.getName().equals(p.getName()) && this.getPhone().equals(p.getPhone()) ){
	return true;
  }
  return false;
}

 

HashSet

HashSet에서 두 객체의 중복 여부를 체크할 때 Object Class의 equals()와 hashCode()를 이용하여 그 결과 값이 같을 경우 동일한 객체로 인식한다. Set Collection에서 객체의 중복을 체크하기 위해서 equals()와 hashCode()를 모두 오버라이딩 하여 사용하면된다. 이때 hashCode() 오버라이딩에서 7,31 과 같은 소수를 이용하여 멤버 변수의 값이 다르면 다른 값을 return 하도록 재정의한다.

@Override
public int hashCode() {
  int hash = 7;
  hash = 31 * hash + this.getName().hashCode();
  hash = 31 * hash + this.getPhone().hashCode();
  return hash;
}