ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 해시 (발표)
    카테고리 없음 2020. 10. 13. 15:27

    배열 -> 검색에 유리

     

    연결 리스트 -> 삽입, 삭제시 유리

     

    --> 이러한 한계를 극복하기 위하셔 제시된 방법이 hash

     

    hash는 내부적으로 배열을 사용하여 데이터를 저장하기 때문에 빠른 검색 속도

     

    데이터의 삽입과 삭제 시 기존 데이터를 밀어내거나 채우는 작업이 필요 없도록 특별한 알고리즘을 이용하여 데이터와

     

    연관된 고유한 숫자를 만들어 낸 뒤 이를 인덱스로 사용

     

    특정 데이터가 저장되는 인덱스를 그 데이터만의 고유한 위치이기 때문에 삽입시 다른 데이터의 사이에 끼어들거나

     

    삭제시 다른 데이터로 채울 필요가 없으므로 삽입, 삭제 시 데이터의 이동이 없도록 만들어진 구조

     


    hash를 상속받는 hashTable, HashMap이 놈들은 hashCode를 이용함으로써 객체를 저장하는 list에 비해 장점을 가진다

     

    key값에는 어떤 객체든 올 수 있기 때문에 객체를 찾는 것 보다는 int값 hashcode()를 찾는것이 더 편하다.

     

     

    hashcode메소드는 Object클래스에서 정의된 그대로의 메소드

     

    하지만 String 타입의 hashcode는 오버라이드를 통해 재정의 해서 사용

     

    왜냐? string클래스에서 hashcode를 재정의하지 않으면 String a= "자바" 와 String b= new String("자바")는 다른 값

     

    근데 String 입장에서 a,b는 같은 객체이다 왜냐? 같은 문자열이니까. 같은 문자열을 갖는 두 객체의 hashcode가 다르다면

     

    hashcode의 의미가 없다. hashcode를 활용해서 Map이나 Set에 저장된 key값을 찾아야 하는데 같은 객체임에도 불구하고

     

    hashcode값이 다르니 제대로 찾을 수가 없다.

     


    equals와 hashcode 메소드는 object 클래스의 메소드

     

    object는 상속 관계상 가장 상위에 있기 때문에 어떤 객체라도 Object의 메소드인 equals와 hashcode를 사용할 수 있다.

     


    equals 메소드에 의해 true가 나오는 두 객체의 hashcode는 같아야한다.

     

    -> equals 메소드 재정의하면 hashcode도 재정의해야된다.

     

    근데, 반대로 hashcode가 같으면 equals가 true여야 한다? 아니다.

     

    실제로 String의 경우 다른 문자열(equals 리턴값은 false)이 같은 hashcode를 리턴하는 경우가 생긴다.

     

    다시말해 String의 hashcode는 객체마다 유일한 값을 리턴하지 않는다.

     

    그럼 어떻게 객체를 hashcode로 구분하냐? 먼저 hashcode로 찾고, 같은 놈이 있다면 equals로 구분한다.

     


    equals(Object)메소드가 true이면 두 객체의 hashCode 값은 같아야 한다.
    equals(Object)메소드가 false이면 두 객체의 hashCode가 꼭 다를 필요는 없다.
    하지만 서로 다른 hashCode 값이 나오면 해시 테이블(hash table)의 성능이 향상될 수 있다는 점은 이해하고 있어야 한다.

     

    댓글

Designed by Tistory.