classEx9_1 {
publicstaticvoidmain(String[] args) {
Valuev1=newValue(10);
Valuev2=newValue(10);
if (v1.equals(v2))
System.out.println("v1과 v2는 같습니다.");
else
System.out.println("v1과 v2는 다릅니다.");
} // main
}
classValue {
int value;
Value(int value) {
this.value = value;
}
//"v1과 v2는 같습니다"를 출력값으로 나오게 할려면 equals() 오버라이딩// Object의 equals()를 오버라이딩해서 주소가 아닌 value를 비교 publicbooleanequals(Object obj) {
//참조변수의 형변환 전에는 반드시 instanceof로 확인해야함. if(!(obj instanceof Value)) returnfalse; //이 코드는 바로 아래 있는 형변환을 위한 확인 코드//Value 객체가 아니면 다른 객체이므로 비교할 필요도 없으니까 false를 바로 반환한다. Valuev= (Value)obj; //obj를 value로 형변환returnthis.value == v.value;
//return this==obj; //주소 비교. 서로 다른 객체는 항상 거짓
}
}
- equals()에서 형변환을 하는데 그 이유는 Object로 들어온 매개변수에는 value라는 변수가 없기 때문이다. 그래서 형변환을 해주어야 한다.
classPerson {
long id;
publicbooleanequals(Object obj) {
if(obj instanceof Person)
return id == ((Person)obj).id;
//obj가 Object타입이므로 id값을 참조하기 위해서는 Person타입으로 형변환이 필요하다. elsereturnfalse; // 타입이 Person이 아니면 값을 비교할 필요도 없다.
}
Person(long id) {
this.id = id;
}
}
cv = 클래스 변수 = static 변수 = 공유 변수 객체마다 공통(공유)
iv = 인스턴스 변수 객체마다 다름(개별)
1. System.out.println(p1==p2); p1 == p2는 주소를 비교한다. 따라서 0x100 == 0x200이 되고, false라는 결과를 반환한다.
2. System.out.println(p1.equals(p2)); p1.equals(p2)는 오버라이딩했기 때문에 그에 따라서 id를 가지고 비교한다. this.id == ((Person)obj).id가 되고, 8011081111222L == 8011081111222L이 되고, true라는 결과를 반환한다.
//obj가 Object타입이므로 id값을 참조하기 위해서는 Person타입으로 형변환이 필요하다.
else
returnfalse; // 타입이 Person이 아니면 값을 비교할 필요도 없다.
}
Person(long id) {
this.id = id;
}
}
cv = 클래스 변수 = static 변수 = 공유 변수 객체마다 공통(공유)
iv = 인스턴스 변수 객체마다 다름(개별)
1. System.out.println(p1==p2); p1 == p2는 주소를 비교한다. 따라서 0x100 == 0x200이 되고, false라는 결과를 반환한다.
2. System.out.println(p1.equals(p2)); p1.equals(p2)는 오버라이딩했기 때문에 그에 따라서 id를 가지고 비교한다. this.id == ((Person)obj).id가 되고, 8011081111222L == 8011081111222L이 되고, true라는 결과를 반환한다.