모든 클래스의 최고 조상으로 오직 11개의 메서드를 가지고 있다. equals(), hashcode(), tostring() 모두 object 클래스의 메서드
class Value{
int value;
value(int value){
this.value = value;
}
}
class test{
public static void main(String[] args){
Value v1 = new Value(10);
Value v2 = new Value(10);
System.out.println(v1.equals(v2));
}
}
위 코드의 결과를 살펴보면 v1과 v2의 참조값이 다르기때문에 false를 출력한다.
v1 == v2 -> 0x1234 == 0x2345 -> false
이처럼 Object 클래스의 equals()는 주소를 비교하기 때문에 인스턴수 변수의 값을 비교하도록 오버라이딩 해서 사용
class Value{
int value;
value(int value){
this.value = value;
}
public boolean equals(Object obj){
//return this==obj // 주소 비교. 서로 다른 객체는 항상 거짓
// 참조변수의 형변환 전에는 반드시 instanceof로 확인
if(!(obj instanceof Value)) return false;
Value v = (Value)obj;
return this.value == v.value;
}
}
class test{
public static void main(String[] args){
Value v1 = new Value(10);
Value v2 = new Value(10);
System.out.println(v1.equals(v2));
}
}
v1 = v2 -> this.value == ((Value)obj).id -> 10 ==10 -> true
Object의 equals()를 오버라이딩해서 주소가 아닌 value 값을 비교
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
기본적으로 toString()은 위와같이 구현되어있기 때문에 아래 코드를 실행하면 Card@19e0bfd 이런식으로 나온다.
class Card{
String kind;
int number;
card(){
this("SPADE",1);
}
}
class main{
public static void main(String[] args){
System.out.println(new Card().toString());
}
}
class Card{
String kind;
int number;
card(){
this("SPADE",1);
}
public String toString(){
return "kind: " + kind + ", number : " + this.number;
}
}
오버라이딩 전 : Card@19e0bfd
오버라이딩 후 : Kind : SPADE , number : 1
오버라이딩 전에는 클래스이름@주소가 나왔지만 오버라이딩 후에는 인스턴스 변수를 문자열로 바꿔준다.