-
20221219 TIL 값 객체를 활용하기TIL 2022. 12. 19. 12:50
저번 레벨 테스트 때 받았던 피드백 중 값 객체를 더 활용해보면 좋을 것 같다는 피드백이 있었다.
'주소'같은 값이 값 객체라는 정도로만 이해하고 있었고, 값 객체인지 엔티티인지 구분이 힘들었기 때문에
레벨테스트에서는 값 객체를 이용하지 않고 프로그램을 짜보았다.
이번 포트폴리오를 만들 때는 식별자가 아닌 값으로 구별되는 값 객체에 대해 조금은 감을 잡았기 때문에 값 객체를 많이 활용해보려고 한다.
그런데 값 객체를 만들면 equals메서드를 재정의하는 게 맞다고 생각을 했다.
왜냐하면 값 객체는 값으로 구별되기 때문에 다른 인스턴스이더라도 값이 같으면 같다고 인식되어야 하기 때문이다.
그런데 equals 메서드를 재정의하면 함께 재정의해야 하는 메서드가 또 하나 있다.
바로 hashCode 메서드이다.
hashCode로 객체를 식별하기 때문에 equals 메서드에서 동등하다고 판단한 값은 같은 hashCode를 반환해야 한다.
hashCode 메서드는 int타입의 반환형을 가지고 있기 때문에
이때까지 hashCode를 어떻게 재정의해야 할지 고민이 되었었다.
물론 해시값은 길이가 정해져있기 때문에 다른 값임에도 동일한 해시값에 매핑되는 해시 충돌이 발생할 수 있다.
즉, 값이 다름에도 해시값이 같을 수 있다.
하지만, 해시 테이블의 성능 향상을 위해 동등하지 않은 값은 다른 값을 반환하는 것이 좋다.
그런데 반환값이 int이기 때문에 값이 문자열인 경우 어떻게 hashCode를 재정의해야할지 고민이 되었다.
예를 들어 주소 값이라고 할 때, 값 자체가 문자열이기 때문에 어떻게 hashCode를 재정의해야할 지 난감했고,
모든 경우에 같은 값을 반환하는 등의 방식을 사용했었다.
좋은 방법같지 않았기 때문에 값객체에서 많이 사용해야 하는 hashCode를 재정의하는 좋은 방식을 찾아보았고,
Objects.hash()라는 메서드를 찾을 수 있었다.
Objects.hash()에 여러 다양한 타입의 값을 넣으면 인풋값들로 해시값이 만들어진다.
이제는 더이상 hashCode를 재정의하는 것이 부담스럽지 않아졌다.
값객체를 사용하면 값의 유효성 검증을 객체지향적으로 각 값객체가 처리할 수 있게 된다는 큰 장점이 있다.
포트폴리오를 진행하면서 값 객체를 사용해서 객체지향에 조금 더 익숙해지도록 훈련을 해보자!
'TIL' 카테고리의 다른 글
20221221 TIL 핸들링 해야하는 예외가 여러 개일 때 어떻게 하면 좋을까? (1) 2022.12.21 20221220 TIL @ElementCollection (0) 2022.12.20 20221218 TIL 깃헙 프로젝트로 프로젝트 관리하기 (0) 2022.12.17 20221217 TIL E2E테스트를 코드로 작성하기 까다로운 부분을 어떻게 작성하면 좋을까? (0) 2022.12.17 20221216 TIL 감사한 하루 (2) 2022.12.16