(내일배움캠프) TIL(4) - 3주차: @Override equals(), hashCode()

Thomas·2023년 5월 31일
0
post-thumbnail

일단은 키오스트 프로젝트를 하면서 특히 선택적 요구사항에 주문개수 기능 추가 부분을 구현하다가 발생한 문제점을 적어볼라고 한다. 키오스크 구현은 다 해서 블로그에 정리해서 올리고 싶지만... 정리하고 블로그 작성까지 시간이 많이 걸릴거 같아서.. 천천히 할 예정이다.. 그리고 블로그에 올릴 글은 계속 밀려서.. 너무 바쁘다

주문개수 기능은 장바구니에 똑같은 상품이 담기면 주문 화면에서 상품 개수가 출력되어야 한다.

이런식으로 ShackBurger를 두번 장바구니에 넣으면 2개 이런씩으로 들어가야하는 것이다.

Map<Order, Integer> frequencyMap = new HashMap<>();
        for (Order order : list) {
            frequencyMap.put(order, frequencyMap.getOrDefault(order, 0) + 1);
            total += order.getPrice();
        }
        for (Map.Entry<Order, Integer> entry : frequencyMap.entrySet()) {
            System.out.println(entry.getKey().getName() + " - " + entry.getKey().getPrice() + " x " + entry.getValue() + "개");
        }

일단 getOrDefault는 찾는 키가 존재한다면 찾는 키의 값을 반환하고 없다면 기본 값을 반환하는 메서드이다. 그래서 향상된 for문으로 List list를 Order order로 받고 반복하면서 각 Order 객체의 빈도수를 계산하는 로직인데...

자꾸 동일한 음식을 선택을 해도 카운트가 2가 아닌 1이 되는거였다...
그래서 구글링을 해도 원하는 값을 못 찾고 결국 chatGPT한테 물어보고 해답을 줘서 코드 수정을 하니깐 바로 된다...

아래 코드 두개가 도움을 받은 코드이다

   @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((getName() == null) ? 0 : getName().hashCode());
        // 다른 필드들도 고려해서 계산
        return result;
    }

HashCode는 일반적으로 각 객체의 주소값을 변환하여 생성한 객체의 고유한 정수값이다. 여기선 주소값 대신 비교할만 한 hash를 직접 만들어 객체를 비교 하도록 되어있다.
그래서 출력 부분도 찍어보면서 비교를 해봤는데

원조김밥이 1566984612이고
떙초김밥이 1436825811이다.
이런식으로 같은 두개의 객체의 해쉬코드가 같으면 같은 김밥이라고 인지를 하는거 같다.

@Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Order other = (Order) obj;
        if (getName() == null) {
            if (other.getName() != null)
                return false;
        } else if (!getName().equals(other.getName()))
            return false;
        // 다른 필드들도 고려해서 비교
        return true;
    }

두 번째 코드는 주어진 객체가 현재 객체와 동일한지, 클래스가 동일한지 확인한 후, getName() 메서드를 통해 필드들을 비교하여 동등성을 판단한다.

equals와 hashCode는 민접한 관계를 가지고 있다. 일단은 동일한 객체는 동일한 메모리 주소를 갖는다는 것을 의미하므로, 동일한 객체는 동일한 해시코드를 가져야 한다. 그렇기 때문에 우리가 equals() 메소드를 오버라이드 한다면, hashCode() 메소드도 함께 오버라이드 되어야 한다.

결론은 두 객체가 equals()에 의해 동일하다면, 두 객체의 hashCode() 값도 일치해야 한다.

profile
Backend Programmer

0개의 댓글