kkkkkkkkkkkk
kkkkk
kkkkkkkkkkkk
전체 방문자
오늘
어제
  • 분류 전체보기
    • CS & OS
    • Algorithms
    • Laguage
    • Book
      • 객체지향의 사실과 오해
      • Effective Java
      • Spring boot 와 AWS로 혼자 구현하는 ..
      • 도메인 주도 계발 시작하기
    • DB
    • Spring
    • Spring Boot
    • JPA
    • Git
    • Clean Code
    • HTTP

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 역할
  • 결합도
  • 응집도
  • 책임
  • 설계 원칙
  • 객체지향 프로그래밍

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
kkkkkkkkkkkk

kkkkk

Algorithms

[JAVA] 해싱 동작 방식

2022. 1. 17. 14:43

학습 내용

  • 해시 코드의 동작 방식을 이해합니다.

 

불변 객체

public class Book {

    private final String name;

    public Book(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    @Override
    public String toString() {
        return "Book{" +
                "name='" + name + '\'' +
                '}';
    }

    @Override
    public boolean equals(Object o) {
        return this.name.toString().equals(o.toString());
    }

    @Override
    public int hashCode() {
        int sum = 0;
        for (int i = 0; i < name.length(); i++) {
            sum += name.charAt(i);
        }
        return sum;
    }
}

 

두 메서드 equals() 메서드가 true를 반환하면 해시 코드도 같아야 하는데

불변 객체를 표현 하기 위해 해시 코드만 같게 나오고 equlas 메서드는 false 가 나올 것입니다. 두 객체는 같아야 할 필요는 없습니다.

 

테스트

Book book = new Book("apple");
Book book1 = new Book("apple");

System.out.println(book.equals(book1));
System.out.println(book.hashCode() + ", " + book1.hashCode());

 

결과

객체가 같나요? : false
해시 코드 : ? 530, 530

 


가변 객체

인스턴스의 값을 변형 시켜버리면 해시 코드의 값이 변경 되므로 하위 맵에서 조회가 불가능 합니다. 따라서 해싱을 사용하는 자료구조에서 가변 객체를 키로 하는 것을 위험합니다.

 

public class Store {

    private String name;

    public Store(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "Store{" +
                "name='" + name + '\'' +
                '}';
    }

    @Override
    public boolean equals(Object o) {
        return this.name.toString().equals(o.toString());
    }

    @Override
    public int hashCode() {
        int sum = 0;
        for (int i = 0; i < name.length(); i++) {
            sum += name.charAt(i);
        }
        return sum;
    }
}

 

테스트

Store book1 = new Store("Word1");
Store book2 = new Store("Word1");

System.out.println(book1.equals(book2));
System.out.println(book1.hashCode());
System.out.println(book2.hashCode());

book1.setName("Word3");
System.out.println(book1.hashCode());
System.out.println(book2.hashCode());

 

결과

false
461
461
463 // 해시 코드가 달라짐
461 

 


정리 

해싱을 사용하는 자료구조에 가변 객체를 사용하면 객체의 해시 코드들의 변형이 생겨 기존에 저장된 맵에 조회를 할 때 엉뚱 한 곳을 조회하기 때문에 key 값을 가변 객체로 사용하는 것은 피해야합니다.

'Algorithms' 카테고리의 다른 글

[Sort] 삽입 정렬 ( Insertion Sort)  (0) 2022.06.26
[Sort] 선택 정렬 (Selection Sort)  (0) 2022.06.26
[Sort] 버블 정렬 (Bubble Sort)  (0) 2022.06.26
[Sort] 선형 탐색 (Linear Search)  (0) 2022.06.26
[JAVA] 성능을 개선한 Map 구현 (해싱)  (0) 2022.01.17
[JAVA] Map 구현  (1) 2022.01.11
[JAVA] Stack 구현  (0) 2022.01.11
[JAVA] LinkedList 구현  (0) 2022.01.10
    'Algorithms' 카테고리의 다른 글
    • [Sort] 버블 정렬 (Bubble Sort)
    • [Sort] 선형 탐색 (Linear Search)
    • [JAVA] 성능을 개선한 Map 구현 (해싱)
    • [JAVA] Map 구현
    kkkkkkkkkkkk
    kkkkkkkkkkkk

    티스토리툴바