yeoseon / tip-archive

트러블 슈팅 및 팁을 모아두는 레포 (Today I Learned)

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Wrapper 클래스 원시값 contains 사용

yeoseon opened this issue · comments

next-step/java-lotto#404 참고

원시값을 감싸서 일급콜렉션 형태로 사용을 했다.
이 일급콜렉션에 대해 원시값이 서로 같은지 비교를 하려면 어떡해야 하는지에서 많이 막혔다.
처음에는 getValue원시값 을 하나 구현해서 했더니 불필요한 메소드 생성이었다.
찾아보고 직접 해결해보자.

해결 내용

값으로 비교하기 위해서는 equals 를 오버라이드 하시면 됩니다.

이해가 잘 안갔었는데, 아래 참고자료를 보고 알았다.
Wrapper 객체의 contains는 equals를 기반으로 비교하기 때문이라는 것을 이해했다.

다음과 같이 해결했다.

  • Lotto.java
  • List 와 LottoNumber 사이의 contains 사용
    public long getMatchedNumberCount(Lotto winningLotto) {
        return winningLotto
                .getValue()
                .stream()
                .filter(winningLottoNumber -> lotto.contains(winningLottoNumber))
                .count();
    }
  • LottoNumber.java
  • 다음과 같이 오버라이딩함.
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        LottoNumber that = (LottoNumber) o;
        return lottoNumber == that.lottoNumber;
    }

    @Override
    public int hashCode() {
        return Objects.hash(lottoNumber);
    }
  • equals 메소드를 오버라이딩 하여 원시값을 비교해오도록 수정하니, contains를 사용해도 잘 동작했다.

이렇게 쉽게 해결할 기본적인 것을.. 5시간 넘게 고민하다니 ㅠㅠ 그래도 하나 배웠다.

참고 자료