본문 바로가기

복습

[Java 복습] hashCode( ), toString( )

hashCode( )

객체의 해시코드를 반환하는 메서드

Object 클래스의 hasCode( )는 객체의 주소를 int로 변환해서 반환

public class Object {
    ...
    public native int hashCode(); // 네이티브 메서드: OS의 메서드(C 언어)
}

 

equals( )를 오버라이딩 하면, hashCode( )도 오버라이딩 해야 한다.

equals( )의 결과가 true인 두 객체의 해시코드는 같아야 하기 때문이다.

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.identityHashCode(Object obj)는 Object 클래스의 hashCode( )와 동일(객체마다 다른 해시코드 반환)

System.identityHashCode(str1)); // 3526198
System.identityHashCode(str2)); // 7699183

 

 

toString( ): 객체를 문자열(String)으로 변환하기 위한 메서드

 

toString( ) 오버라이딩: 객체(iv들의 모음)값들을 문자열로 바꾼다.

class Card {
    String kind;
    int number;

    Card() {
        this("SPADE", 1);
    }
    Card (String kind, int number) {
        this.kind = kind;
        this.number = number;
    }
}

public class toString {

    public static void main(String[] args) {
        Card c1 = new Card();
        Card c2 = new Card();

        System.out.println(c1);
        System.out.println(c2);
    }
}
ex.obj.Card@2f4d3709
ex.obj.Card@4e50df2e

class Card {
    String kind;
    int number;

    Card() {
        this("SPADE", 1);
    }
    Card (String kind, int number) {
        this.kind = kind;
        this.number = number;
    }
    // Object 클래스의 toString()을 오버라이딩
    public String toString() {
        return "kind: " + kind + ", number: " + number;
    }
}

public class toString {

    public static void main(String[] args) {
        Card c1 = new Card();
        Card c2 = new Card();

        System.out.println(c1);
        System.out.println(c2);
    }
}
kind: SPADE, number: 1
kind: SPADE, number: 1

 

객체들이 가지고 있는 iv값을 출력해주는 것이 더 눈에 확인하기 편하다.

 

import java.util.Objects;

class Card {
    String kind;
    int number;

    Card() {
        this("SPADE", 1);
    }
    Card (String kind, int number) {
        this.kind = kind;
        this.number = number;
    }

    @Override
    public String toString() {
        return "kind: " + kind + ", number: " + number;
    }

    @Override
    public boolean equals(Object obj) {
        if (!(obj instanceof Card)) {
            return false;
        }
        Card c = (Card)obj;
        return this.kind.equals(c.kind) && this.number == c.number;
    }
    // equals()를 오버라이딩하면 hashCode() 도 오버라이딩 해야한다.
    // equals()를 오버라이딩하면 객체의 iv값이 같을 때 같은 참조값(주소 값)이 나온다.
    public int hashCode() {
        return Objects.hash(kind, number); // 가변 인자
    }
}

public class toString {

    public static void main(String[] args) {
        Card c1 = new Card();
        Card c2 = new Card();

        System.out.println(c1.equals(c2));
        System.out.println(c1.hashCode());
        System.out.println(c2.hashCode());

        System.out.println(c1.toString());
        System.out.println(c2.toString());
    }
}