자바의 정석 - hashCode(), toString()

Yohan·2024년 2월 2일
0

hashCode()

  • 객체의 해시코드(hash code)를 반환하는 메서드
    • 해시는 정수 값
  • Object클래스의 hashCode()는 객체의 주소를 int로 변환해서 반환
  • equals()를 오버라이딩하면, hashcode()도 오버라이딩 해야함!
    • equals()는 주소를 iv를 가지고 작업하게 오버라이딩함. 마찬가지로 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

// 위 코드는 equals()와 hashcode()가 오버라이딩이 잘 된 코드

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

  • toString() : 객체를 문자열(String)으로 변환하기 위한 메서드
  • toStirng()을 오버라이딩함으로써 test.Card@1d81eb93과 같은 클래스 주소가 출력되는 것이 아닌 kind:SPADE, number:1 꼴의 iv객체의 값이 출력되게 했음!
class Card {
	String kind;
	int number;
	
	Card() {
		this("SPADE", 1);
	}
	
	Card(String kind, int number) {
		this.kind = kind;
		this.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; 
	}
	
	
	// Object클래스의 toString()을 오버라이딩
	public String toString() {
		return "kind: "+kind+", number:"+number;
	}
}


public class Ex1 {
	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());
	}
}
// 출력 값

// true

// -1842861219
// -1842861219

// kind:SPADE, number:1
// kind:SPADE, number:1
profile
백엔드 개발자

0개의 댓글