객체가 소멸될 때 가비지 컬렉터에 의해 자동적으로 호출된다. 이 때 수행되어야하는 코드가 있을 때 오버라이딩한다. (거의 사용 안 함)
public Class getClass()
객체 자신의 클래스 정보를 담고 있는 Class인스턴스를 반환한다. => 설계도 객체를 준다. 1. 객체 생성 2. 객체 정보를 얻음 => Reflection API. 자바 기본 API에 포함됨
pulbic int hashCode()
객체 자신 의 해시코드를 반환한다.
public String toString()
객체 자신의 정보를 문자열로 반환한다.
public void notify()
객체 자신을 사용하려고 기다리는 스레드를 하나만 깨운다.
public void notifyAll()
객체 자신을 사용하려고 기다리는 모든 스레드를 깨운다.
public void wait() public void wait(long timeout) public void wait(long timeout, int nanos)
다른 스레드가 notify()나 notifyAll()을 호출할 때까지 현제 스레드를 무한히 또는 지정된 시간(timeout, nanos)동안 기다리게 한다. (timeout은 천 분의 1초, nanos는 10^9분의 1초)
2. equals(Object obj)
- 객체 자신(this)과 주어진 객체(obj)를 비교한다. 같으면 true, 다르면 false
- Object클래스의 equals()는 객체의 주소를 비교(참조변수 값 비교)
public boolean equals(Object obj) {
return (this == obj); //주소 비교
}
class Value {
int value;
Value(int value) {
this.value = value;
}
}
class Ex9_1 {
public static void main(String[] args) {
Value v1 = new Value(10);
Value v2 = new Value(10);
System.out.println(v1.equals(v2));
} // main
}
class Ex9_1 {
public static void main(String[] args) {
Value v1 = new Value(10);
Value v2 = new Value(10);
if (v1.equals(v2))
System.out.println("v1과 v2는 같습니다.");
else
System.out.println("v1과 v2는 다릅니다.");
} // main
}
class Value {
int value;
Value(int value) {
this.value = value;
}
//"v1과 v2는 같습니다"를 출력값으로 나오게 할려면 equals() 오버라이딩
// Object의 equals()를 오버라이딩해서 주소가 아닌 value를 비교
public boolean equals(Object obj) {
//참조변수의 형변환 전에는 반드시 instanceof로 확인해야함.
if(!(obj instanceof Value)) return false; //이 코드는 바로 아래 있는 형변환을 위한 확인 코드
//Value 객체가 아니면 다른 객체이므로 비교할 필요도 없으니까 false를 바로 반환한다.
Value v = (Value)obj; //obj를 value로 형변환
return this.value == v.value;
//return this==obj; //주소 비교. 서로 다른 객체는 항상 거짓
}
}
- equals()에서 형변환을 하는데 그 이유는 Object로 들어온 매개변수에는 value라는 변수가 없기 때문이다. 그래서 형변환을 해주어야 한다.
3. equals(Object obj)의 오버라이딩
- 인스턴스 변수(iv)의 값을 비교하도록 equals()를 오버라이딩해야 한다.
class Person {
long id;
public boolean equals(Object obj) {
if(obj instanceof Person)
return id == ((Person)obj).id;
//obj가 Object타입이므로 id값을 참조하기 위해서는 Person타입으로 형변환이 필요하다.
else
return false; // 타입이 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라는 결과를 반환한다.