[Java] hashCode와 Equals를 함께 재정의하는 이유

2024. 3. 17. 23:33·JAVA-기초/JAVA기본
목차
  1. Set과 Map의 타입이 Wrapper Class가 아닌 Object를 받을 때 중복 검사는 어떻게 진행하는가?
728x90
반응형
SMALL

 

Set과 Map의 타입이 Wrapper Class가 아닌 Object를 받을 때 중복 검사는 어떻게 진행하는가?

➕ hashCode() 메서드를 오버라이딩하여 리턴된 해시코드 값이 같은지 판단합니다. 값이 다르다면 다른 객체로 판단하고, 해시코드 값이 같다면 equals()메서드를 오버라이딩 하여 다시 비교합니다.

위의 개념을 위해서는 동일성과 동등성을 먼저 알아야한다.

 

**동일성** : 두 개의 객체가 완전히 하나의 같은 객체인지 판단하는 것. 즉 , 메모리에 저장된 주소공간이 완전히 같을 경우 동일성이 보장된다.

 

 

**동등성** : 두 객체의 주소공간이 달라도 단순히 가지고 있는 값만 같다면 동등성이 보장된다.

 

이는 단순 문자열(원시형)과 객체로 생성한 값 사이의 차이점과 동일하다.

그 다음으로는 equals의 필요성이다. equals가 필요한 이유는 객체지향의 캡슐화 개념때문이기도 하다. 내부 사앹 정보를 숨긴 채로 두 객체의 동등성 정보를 파악해야 하는데, 따라서 상태 간 비교가 아닌 더 큰 개념에서 객체와 객체 사이의 정보를 비교해야 한다. 그러므로 equals의 오버라이딩이 필요하다.

  • 예시코드(equals 그대로 사용)
    • 내부 상태가 완전히 같아도 동등성을 보장할 수 없다.
    public static void main(String[] args) {
            Car car1 = new Car(1,"sonata");
            Car car2 = new Car(1,"sonata");
            System.out.println(car1.equals(car2)); //false
        }
    
  • 예시코드(equals를 재정의)
    • 동등성이 보장된다.
    public class Car {
    
        private final int id;
        private final String name;
    
        public Car(int id, String name) {
            this.id = id;
            this.name = name;
        }
    
        @Override
        public boolean equals(Object o) {
            if (this == o) {
                return true;
            }
            if (o == null || getClass() != o.getClass()) {
                return false;
            }
    
            Car car = (Car) o;
    
            if (id != car.id) {
                return false;
            }
            return Objects.equals(name, car.name);
        }
    }
    
    public static void main(String[] args) {
            Car car1 = new Car(1,"sonata");
            Car car2 = new Car(1,"sonata");
            System.out.println(car1.equals(car2)); //true
        }
    

마지막으로 가장 중요한 hashcode는 왜 필요한가이다. equals만 잘 재정의하면 모든 객체의 동등성이 보장될 것 같지만 그렇지 않다. Hash값을 사용하는 Hash Collection 자료구조(HashMap, HashSet, HashTable)때문에 발생한다.

  • 예시코드
    • Set을 사용하여 완전히 상태가 같은 객체를 두 번 넣어지만 길이가 1이아닌 2가 나온다.
    • 동등성 보장에 실패한 것이다.
    • 원인은 아래의 사진과 같다.
    public static void main(String[] args) {
            Set<Car> cars = new HashSet<>();
            cars.add(new Car(1, "sonata"));
            cars.add(new Car(1, "sonata"));
    
            System.out.println(cars.size()); // 2 -> HashSet 사이즈가 1이 아닌 2임 
        }
    

보장되지 않는 이유

  • Hash를 사용하는 Collection들은 객체의 동등성 비교를 다음 고정과 같이 수행한다.
  • 일단 hashcode값이 서로 같아야만 equals메소드로 객체비교를 수행한다.
  • hashcode와 equals를 모두 재정의 해줘야 객체의 동등성이 비교된다.

 

728x90
반응형
SMALL

'JAVA-기초 > JAVA기본' 카테고리의 다른 글

[Java- Algorithm] 너비 우선 탐색법(BFS과 큐(Queue)  (0) 2024.02.28
[자료구조 - Graph 와 DFS] Graph와 DFS란?  (0) 2024.02.24
자바(java) - Optional이란?  (2) 2023.12.06
[Java] 객체지향개념(OOP) 캡슐화와 정보은닉  (3) 2023.09.03
객체지향 프로그래밍 5가지 설계 원칙, SOLID- 단일책임의 원칙  (64) 2023.08.12
  1. Set과 Map의 타입이 Wrapper Class가 아닌 Object를 받을 때 중복 검사는 어떻게 진행하는가?
'JAVA-기초/JAVA기본' 카테고리의 다른 글
  • [Java- Algorithm] 너비 우선 탐색법(BFS과 큐(Queue)
  • [자료구조 - Graph 와 DFS] Graph와 DFS란?
  • 자바(java) - Optional이란?
  • [Java] 객체지향개념(OOP) 캡슐화와 정보은닉
공부하고 기억하는 공간
공부하고 기억하는 공간
IT 비전공자로 시작하여 훌륭한 개발자가 되기 위해 공부하고 있는 공간입니다. 틀린 내용이나 부족한 부분이 있으면 댓글로 알려주세요 바로 수정하겠습니다.
IT - railroadIT 비전공자로 시작하여 훌륭한 개발자가 되기 위해 공부하고 있는 공간입니다. 틀린 내용이나 부족한 부분이 있으면 댓글로 알려주세요 바로 수정하겠습니다.
    250x250
  • 공부하고 기억하는 공간
    IT - railroad
    공부하고 기억하는 공간
  • 전체
    오늘
    어제
    • 분류 전체보기 (314) N
      • 면접 준비 (36) N
        • OS (6)
        • Spring Security (0)
        • Java (2) N
        • DB (9)
        • Network (3)
      • ElasticSearch (2)
      • Kafka (4)
      • Spring (22)
        • Spring Cloud (7)
        • Security6 (5)
        • JPA (12)
        • 프로젝트 리팩토링 회고록 (4)
        • Logging (8)
        • Batch (2)
      • Redis (17)
        • Redis 개념 (8)
        • Redis 채팅 (5)
        • Redis 읽기쓰기 전략 (1)
      • AWS (11)
      • 리눅스 (29)
        • 리눅스 마스터 2급 (5)
        • 네트워크(기초) (7)
        • 리눅스의 이해 (6)
        • 리눅스의 설치 (2)
        • 리눅스 운영 및 관리 (6)
      • JAVA-기초 (16)
        • JAVA기본 (11)
        • Design Pattern (5)
      • JSP (27)
        • JSP 기본 개념 (10)
        • JSP (1)
      • SQL (1)
      • TIL (36)
      • 문제 풀이 (2)
        • Programmers (9)
        • 백준 문제풀이 (28)
      • JavaScript (10)
      • HTML (17)
      • Ngrinder (1)
        • Ngrinder 문서 정리 (1)
  • 블로그 메뉴

    • 링크

    • 공지사항

    • 인기 글

    • 태그

      백준
      Springframework
      리눅스
      jsp request
      레디스
      springsecurity
      Spring Data Redis
      redis
      자바 면접질문
      JavaScript
      자바 반복문
      프로그래머스
      리눅스마스터2급
      자바 면접
      리눅스마스터2급정리
      Til
      JS
      Spring
      java
      자바
      CSS
      스프링프레임워크
      spring redis
      JSP
      자바스크립트
      jsp기초
      자바기초
      자바 알고리즘
      redis 채팅
      HTML
    • 최근 댓글

    • 최근 글

    • hELLO· Designed By정상우.v4.10.3
    공부하고 기억하는 공간
    [Java] hashCode와 Equals를 함께 재정의하는 이유

    개인정보

    • 티스토리 홈
    • 포럼
    • 로그인
    상단으로

    티스토리툴바

    단축키

    내 블로그

    내 블로그 - 관리자 홈 전환
    Q
    Q
    새 글 쓰기
    W
    W

    블로그 게시글

    글 수정 (권한 있는 경우)
    E
    E
    댓글 영역으로 이동
    C
    C

    모든 영역

    이 페이지의 URL 복사
    S
    S
    맨 위로 이동
    T
    T
    티스토리 홈 이동
    H
    H
    단축키 안내
    Shift + /
    ⇧ + /

    * 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.