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());
}
}
'복습' 카테고리의 다른 글
[Java 복습] String 클래스, StringBuffer, StringBuilder (0) | 2024.05.03 |
---|---|
[Java 복습] Object 클래스 (0) | 2024.05.03 |
[Java 복습] 예외처리 (1) | 2024.05.02 |
[Java 복습] 내부 클래스 (0) | 2024.05.02 |
[Java 복습] 인터페이스의 장점 (0) | 2024.05.02 |