달력

7

« 2019/7 »

  •  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  •  
  •  
  •  
2007.08.09 18:26

객체의 hashcode에 대한 고찰 그거/Java2007.08.09 18:26

# hashcode
  대부분 버전의 Java 에서 hashcode는 Heap에 있는 객체의 메모리 주소를 바탕으로 생성됩니다.
  따라서 서로 다른 객체가 같은 hashcode를 가질 수는 없습니다.

# 두 객체가 같다는 것의 의미는?
  1. reference 동치
    Heap에 있는 한 객체를 서로 다른 reference로 참조하는 경우
    두 reference에 대해서 hashCode() method를 호출하면 똑같은 결과가 나옵니다.
 

    String a = "test";
    String b = "test";

    System.out.println("# a.hashCode() : " + a.hashCode());
    System.out.println("# b.hashCode() : " + b.hashCode());

    # a.hashCode() : 3556498
    # b.hashCode() : 3556498


  2. 객체 동치
    Heap에 객체가 두 개 들어있고, 두 reference가 각 객체를 참조하지만 그 두 객체가 동치인 것으로 간주할 수 있는 경우
    Object class로부터 상속받은 hashCode() 와 equals() method를 모두 override 해야 합니다.
    hashCode() method를 override 하지 않으면 기본적으로 객체마다 유일한 hashcode 값을 반환하게 됩니다.

# hashCode() 와 equals() 에 관련된 규칙

  1. 두 객체가 같으면 반드시 같은 hashcode를 가져야 한다.
  2. 두 객체가 같으면 equals() method를 호출했을 때 true를 반환해야 한다.
     즉, a, b가 같으면 a.equals(b)와  b.equals(a) 둘 다 true 여야 한다.
  3. 두 객체의 hashcode 값이 같다고 해서 반드시 같은 것은 아니다.
     하지만 두 객체가 같으면 두 hashcode는 반드시 같아야 한다.
  4. equals()를 override 하면 반드시 hashCode()도 override 해야 한다.
  5. hashCode() 에서는 기본적으로 Heap에 있는 각 객체마다 서로 다른 값을 가지는 유일한 정수를 반환합니다.
     Class에서 hashCode() method를 override 하지 않으면 절대로 그 유형의 두 객체가 같은 것으로 간주될 수 없습니다.
  6. equals() method 에서는 기본적으로 == 연산자를 써서 객체를 비교합니다.
     즉, 두 reference가 Heap 에 있는 한 객체를 참조하는지를 확인하죠.
  따라서 equals()를 override 하지 않으면 절대 그 유형의 두 객체가 같은 것으로 간주될 수 없습니다.
  서로 다른 객체에 대한 reference에 들어있는 bit들이 같을 수가 없으니까요.
  7. a.equals(b)가 true 라면 a.hashCode() == b.hashCode() 도 성립합니다.
     하지만 a.hashCode() == b.hashCode() 가 성립해도 a.equals(b) 가 반드시 true 인 것은 아닙니다.

# hashCode() method 에서 사용하는 'Hashing Algorithm' 에서 서로 다른 객체들에 대해 같은 hashcode 값을 만들어낼 수 있기 때문에
  객체가 같지 않더라도 hashcode는 같을 수 있습니다.


 

'그거 > Java' 카테고리의 다른 글

JDK 5.0의 새로운 기능 Generics  (1) 2007.08.13
java Collection 들  (0) 2007.08.10
객체의 hashcode에 대한 고찰  (0) 2007.08.09
The Factory Method Pattern - Design Patterns in Java -  (1) 2007.05.30
MVC 기반 게시판 만들기  (2) 2007.04.27
Collection Framework  (0) 2007.04.23
TAG
Posted by 뽀기