hashCode(),toString()


hashCode()

  • 객체의 주소
  • 객체의 해시코드 를 반환하는메서드
  • Object 클래스의 hashCode()는 객체의 주소를 int 변환해서 반환

  • equals()를 오버라이딩하면 따로 hashCode()도 오버라이딩해야한다
  • equals() 의 결과가 true인 두 객체의 해시코드는 같아야 하기 때문
  • equals() 는 iv 를 이용하니까

  • System.identityHashCode(Object obj)는 Object클래스의 hashCode()와 동일.
  • 객체마다 다른해시코드를 반환하는해시코드

      class Ex9_3 {
          public static void main(String[] args) {
              String str1 = new String("abc");
              String str2 = new String("abc");
    
              System.out.println(str1.equals(str2)); //true
              System.out.println(str1.hashCode()); // 96354
              System.out.println(str2.hashCode()); // 96354
    
              System.out.println(System.identityHashCode(str1)); //3526918
              System.out.println(System.identityHashCode(str2)); //7699183
          }
      }
    
32비트 JVM 주소 int
64비트 자바머신으로 바뀌면서 주소값이 겹칠수도있다

toStirng(), toString()의 오버라이딩 문자열

  • toString() : iv 객체를 문자열(String)으로 변환하기위한 메서드
  • Object > toString(),equals() 메서드등을 이외의 다른것들도 가지고있는 모든클래스의 조상클래스
  • 클래스들은 자식이기때문에 Object안의 많은기능들 사용가능

      public Stirng toString() {
          return getClass().getName() + "@" + Integer.toHexString(hashcode());
      } //      설계도객체.클래스이름    +    위치(at)  +       16진          객체주소 
    

equals() 오버라이딩 String 값이 같은지 true,false로 확인

  • Object 클래스에서는 equals(), hashCode(), toString(), clone(), wait(), notify(), notifyAll() 등의 메서드를 제공

  • 오버라이딩 : 메서드는 부모 클래스 의 메서드와 메서드 이름, 매개변수 타입, 리턴 타입이 모두 동일해야 합니다.
    부모보다 접근제어자를 더 넓게 생성할수없다.
  • 오버라이딩을 하려면 선언부가 일치해야한다 그러니 Object < equals(Object obj)로 감싸줘야한다

      public boolean equals(Object obj) {
          if (!(obj instanceof Card)) // instanceof 부모자식관계인지 형변환물어보기 참트루로 반환됨
              return false;
    
          Card c = (Card)obj; // 형변환 객체의은닉성으로인해서 c 에서사용할수있는 리모컨의멤버갯수를 줄였다 (object의 기능들은포함)
          return this.kind.equals(c.kind) && this.number == c.number; //
    
      }
    

String 클래스안에 equals(),toString()이 존재한다라고생각

instanceof

  • 참, 거짓을 반환한다
  • 부모 자식관계 인지 확인해본다 ( 누가 부모이건 자식이던 상관없음 )

(false (문자열로 바뀌었을뿐 주소는 다르다) (주소를같게하기위해) // true로 이퀄스를 감싸기위해 equals로 true를 만들려고한다)

(== 메모리상에 올려진 주소가같은지 위치를 가리키고
equal()는 변수로올라간 실제 내포한 값 :spade 를 가르킨다

&& 논리연산자로 boolean 값에대한 계산발동 양쪽둘다 true면 true
== 비교연산자로 두값이 서로같은지 true )

여기까지는 컴파일러창에 보여진 문자열의값만같다 주소값은다르다

true
kind:SPADE, number:1 // 1429302 주소값은다르다 kind:SPADE, number:1 // 2039441 주소값 다름

그러니 equals()+hashCode() 같이해야한다

hashCode() 오버라이딩 주소값 같게

    public int hashCode() {
        return Objects.hash(kind,number)
    }

이제 주소값이 같다

  • equals()를 오버라이딩하면 hashCode()도 overriding한다
  • equals()의 결과가 true인 두 객체의 해시코드는 같아야 하기 때문

Categories:

Updated:

Leave a comment