달마루
기획자에서 개발자로
달마루
전체 방문자
오늘
어제
  • 분류 전체보기 (344) N
    • 기획 이야기 (3)
    • 개발자로 전향한 이유 (1)
    • Github Address (1)
    • 개발자, 그 여정 (11)
      • 기초특강 (4)
      • 국비학원 선정 (4)
      • BitCamp_수업내용 (1)
      • 학원 프로젝트 후기 (1)
      • 정보처리기사 (1)
      • 개발 이야기 (0)
    • 개념 창고 (136) N
      • JAVA (53) N
      • CS (1)
      • Database (28)
      • NetWork (4)
      • 자료 구조 (2)
      • React (8)
      • Spring (5)
      • JPA (2)
      • HTML & CSS (18)
      • JS (4)
    • algorithm (186)
      • 백준 (161)
      • 프로그래머스 (23)
    • 사는 이야기 (0)

블로그 메뉴

  • Github
  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 자바
  • BOJ
  • 알고리즘
  • java algorithm
  • BRONZE
  • 혼공SQL
  • 백준
  • BOJ algorithm
  • Bronze III
  • sql 문제풀이
  • select
  • 백준알고리즘
  • Bronze V
  • MySQL
  • 알고리즘풀이
  • java
  • Scanner
  • math
  • 백준문제풀이
  • SQL
  • 혼공MySQL
  • 혼자공부하는SQL
  • react
  • SQL고득점Kit
  • programmers
  • HTML
  • 프로그래머스
  • Algorithm
  • 문제풀이
  • Bronze IV

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
달마루

기획자에서 개발자로

[Java] equals() 를 재정의하면 hashCode() 도 재정의해야 하는 이유
개념 창고/JAVA

[Java] equals() 를 재정의하면 hashCode() 도 재정의해야 하는 이유

2026. 10. 22. 10:02

객체는 기본값을 쓰면 주소로 비교된다.

내용이 같아도 다른 개체로 인식된다.

equals() 를 재정의하면 반드시 hashCode() 도 같이 고쳐야 한다.

1. 기본 동작 이해하기

class Person {
    String name;
}
Person a = new Person();
a.equals(b); // 주소 비교로 false

기본 equals() 는 메모리 주소를 비교한다.

내용이 같아도 주소가 다르면 false 가 된다.

재정의하지 않으면 내용 비교는 불가능하다.

2. hashCode() 의 역할

Map<Person, String> map = new HashMap<>();
Person p1 = new Person();
p1.name = "홍길동";
map.put(p1, "홍길동");

해시맵은 키를 넣어둘 때 해시값을 계산한다.

equals() 가 다르면 같은 객체로 보지 않는다.

hashCode() 를 올바르게 구현하지 않으면, equals() 로 같다고 판단되는 객체들이 해시맵 내에서 올바르게 검색되지 않을 수 있다.

3. 재정의 시 주의점

class Person {
    String name;
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Person person = (Person) o;
        return Objects.equals(name, person.name);
    }
    @Override
    public int hashCode() {
        return Objects.hash(name);
    }
}

equals() 를 고치면 hashCode() 도 반드시 맞춰야 한다.

같은 내용을 가진 객체는 같은 해시값을 가져야 한다.

규칙을 지키지 않으면 해시맵에서 오류가 발생한다.

4. 실수하기 쉬운 경우

class BadPerson {
    String name;
    @Override
    public boolean equals(Object o) {
        if (o instanceof Person) return true; // 너무 느슨함
        return false;
    }
    // hashCode() 는 재정의 안 함 -> 기본값 사용
}

equals() 가 너무 넓으면 해시맵이 깨진다.

hashCode() 를 안 고치면 같은 값도 다른 박스에 들어간다.

검색할 때 올바른 결과를 얻지 못하게 된다.

저작자표시 비영리 변경금지 (새창열림)

'개념 창고 > JAVA' 카테고리의 다른 글

[CS] 뮤텍스(Mutex)와 세마포어(Semaphore) 차이  (0) 2026.10.24
[Java] 추상 클래스와 인터페이스 차이  (0) 2026.10.16
[Java] 문자열(String) 비교시 equals()와 == 차이  (0) 2024.07.30
[Java] Unsigned int 구현 방법  (0) 2024.01.31
자바 메모리 영역(Method, Stack, Heap)  (0) 2023.01.17
    '개념 창고/JAVA' 카테고리의 다른 글
    • [CS] 뮤텍스(Mutex)와 세마포어(Semaphore) 차이
    • [Java] 추상 클래스와 인터페이스 차이
    • [Java] 문자열(String) 비교시 equals()와 == 차이
    • [Java] Unsigned int 구현 방법
    달마루
    달마루
    항상 어제보다 좋은 코드를 지향합니다. https://github.com/kk4002

    티스토리툴바