본문 바로가기
프로그래밍/JAVA

자바의 정석 기초 ( hashCode() / toString() / toString() 오버라이딩)

by ✲ 2020. 7. 21.
반응형

남궁성님의 자바의 정석 기초편을 보면서 혼자 공부하는 공간입니다. 참고 부탁드립니다. 

hashCode()

- 객체의 해시코드(hash code)를 반환하는 메서드

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

    public class Object {
        ...                                    
        public native int hashCode(); // 네이티브메서드 : os의 메서드(c언어) (내용이 없는 이유는 이미 작성되어 있는 메서드를 호출하기 때문) 

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

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

- System.identityHashCode(Object obj)는 Object클래스의 hashCode()와 동일 

System.out.println(System.identityHashCode(str1));  // 3526198 

System.out.println(System.identityHashCode(str2)): // 7699183

 

toString() / toString()의 오버라이딩

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

// Object클래스의 toString() 

public String toString() {

    return getClass().getName() + "@" + Integer.toHexString(hashCode());

}

예제

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
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;
    }
    //Object 클래스의 toString()을 오버라이딩
    public String toString() {
        return "kind : " + kind + ", number : " + number;
    }
    
    //equals()를 오버라이딩하면 hashCode()도 오버라이딩 해야한다.
    public int hashCode() {
        return Objects.hash(kind, number);
    }
    
    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 사용 이유는 kind가 String 이기 때문 
    }
    
}
 
 
class Ex9_4 {
 
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Card c1 = new Card();
        Card c2 = new Card();
        
        System.out.println(c1.equals(c2));
        
        System.out.println(c1.toString());
        System.out.println(c2.toString());
        
        System.out.println(c1.hashCode());
        System.out.println(c2.hashCode());
    }
 
}
 
cs

출력

true
kind : SPADE, number : 1
kind : SPADE, number : 1
-1842861219
-1842861219

반응형

댓글