본문 바로가기

롱런 프로젝트

컬렉션을 활용한 객체를 사용할 경우

 

Volunteer 라는 클래스를 정의하고

지원자들을 모아 비교하고 확인하는 로직 또한 필요하기 때문에

컬렉션으로 묶는 VolunteerSet 또한 정의했다. 

 

일단 컬렉션으로 묶은 필드를 포함하는 클래스를 정의할 때,

즉 래핑한 해당 컬렉션의 장점은 컬렉션에서 정의한 공개 메서드들을 통제할 수 있다.

그리고 래핑한 클래스의 이름을 가독성 좋게 짓는다면 그 또한 장점이라 할 수 있다.

내부 캡슐화도 된다.

 

이때 컬렉션에서 주로 사용되는 메서드들이 객체 내부적으로 사용하는 메서드가 있다.

바로 equalshashCode 메서드다.

 

이 메서드를 재정의 해야 래퍼클래스에서 사용하는 동작들을 커스텀 할 수 있다.

 

현 프로젝트를 예시로 든다면

Volunteer 클래스의 equals 와 hashCode 는 

해당 클래스의 필드값인 Member 객체의 equals 와 hashCode 를 따른다

물론 부가적인 필드값이 Volunteer 의 정의 ( 이 정의는 내가 결정한다 ) 를 결정할 수 있다면

함께 포함시키는것이 맞지만, 현재로썬 Member 객체의 동등성 여부로만 판단하고 싶기 때문이다.

 

물론 Member 의 equals 와 hashCode 도 재정의해야 한다.

 

 

 

Effective Java 3/E - item11

 

"hashCode 를 재정의하지 않으면 논리적 동치인 두 객체가 서로 다른 해시코드를 반환한다. HashMap 은 해시코드가 다른 엔트리끼리는 동치성 비교를 시도조차 하지 않도록 최적화되어 있기 때문에 재정의 되지 않은 hashCode 를 갖는 객체는 같은 객체라 판단하더라도 리턴값이 달라질 수 있다."