hashCode()
객체의 해시코드(hash code)를 반환하는 메서드이다.
Object클래스의 hashCode()는 객체의 주소를 int로 변환해서 반환한다.
public class Object {
...
public navtive int hashCode(); // 내용 X 네이티브 메서드 : OS의 메서드 (C언어)
}
equals()를 오버라이딩하면 hashCode()도 오버라이딩해야 한다.
equals()의 결과가 true인 두 객체의 해시코드는 같아야 하기 때문이다.
public 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.identifyHashCode(Object obj)는 Object클래스의 hashCode()와 동일하다.
System.out.println(System.identityHashCode(str1)); // 589431969 출력
System.out.println(System.identityHashCode(str2)); // 1252169911 출력
// 참고 32bit JVM은 주소가 int 범위 이내이다.
// 하지만 64bit JVM은 주소가 long타입 범위 이내이기에 겹치는 주소가 있을 수도 있다.
}
}
toString()
객체를 문자열(String)으로 변환하기 위한 메서드이다.
public String toString() {
return getClass().getName()+"@"+Integer.toHexString(hasCode());
// 반환 설계도객체().클래스이름()+at(위치).정수.16진.(객체주소)
}
대부분은 다르지만, 오버라이징하면 같을 수도 있다. (가능성)
예제 Ex9_4
package ch09;
class Card {
String kind;
int number;
Card() {
this("SPADE", 1);
}
Card(String kind, int number) {
this.kind = kind;
this.number = number;
}
}
class Ex9_4 {
public static void main(String[] args) {
Card c1 = new Card();
Card c2 = new Card();
System.out.println(c1.toString()); // Card@232204a1
System.out.println(c2.toString()); // Card@4aa298b7
}
}
equals가 true일 때는 hashCode값이 같게 나온다.
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;
}
public String toString() {
return "kind : "+ kind + ", number : " + number;
}
// equals()를 오버라이딩하면 hashCode()도 오버라이딩 해야한다.
public int hashCode() {
return Objects.hash(kind, number); // return Object"s"인 것을 주의해야한다.
// 매개변수가 가변인자라서, 여러개 넣어도 된다.
}
// 오버라이딩을 할 때는 선언부가 일치해야한다.
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;
}
}
class Ex9_4 {
public static void main(String[] args) {
Card c1 = new Card();
Card c2 = new Card();
System.out.println(c1.equals(c2));
System.out.println(c1.toString()); // kind : SPADE, number : 1 출력
System.out.println(c2.toString()); // kind : SPADE, number : 1 출력
// equals가 true일 때는 hashCode값이 같게 나온다.
System.out.println(c1.hashCode()); // -1842861219 출력
System.out.println(c2.hashCode()); // -1842861219 출력
}
}
'Java, Spring' 카테고리의 다른 글
메서드 (0) | 2022.08.11 |
---|