object 클래스는 모든 클래스의 최고 조상이므로 object 클래스의 멤버들은 모든 클래스에서 바로 사용 가능
Object 클래스는 멤버변수는 없고 오직 11개의 메서드만 가지고 있음
Object 클래스의 메서드 | 설명 |
---|---|
protected Object clone() | 객체 자신의 복사본을 반환 |
public boolean equals(object obj) | 객체 자신과 객체 obj가 같은 객체인지 알려줌(같으면 true) |
protected void finalize() | 객체가 소멸될 때 가비지컬렉터에 의해 자동적으로 호출됨 |
이 때 수행되어야하는 코드가 있을 때 오버라이딩 함(거의 사용X) | |
public class getClass() | 객체 자신의 클래스 정보를 담고 있는 class 인스턴스를 반환 |
public 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)동안 기다리게 함 |
매개변수로 객체의 참조변수를 받아 비교하여 그 결과를 boolean
값으로 알려주는 역할
public boolean equals(Object obj) {
return (this == obj);
}
public class EqualsEx1 {
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는 다름"); // 다른 객체를 참조(다른 주소를 가짐)
v2 = v1; // v2가 v1이 참조하는 객체(값 10)를 바라봄
if (v1.equals(v2))
System.out.println("v1과 v2는 같음");
else
System.out.println("v1과 v2는 다름"); // true 반환
}
}
class Value {
int value;
Value(int value) {
this.value = value;
}
}
equals 메서드는 두 개의 참조변수가 같은 객체를 참조하고 있는지(갖고있는 있는 주소값)만 비교했다
그렇다면, equals메서드로 Value 인스턴스가 가지고 있는 value 값을 비교하도록 할 수 없을까?
Value 클래스에서 equals 메서드를 오버라이딩하여 주소가 아닌 객체에 저장된 내용을 비교하도록 변경할 수 있음
class Person {
long id;
public boolean equals(Object obj) {
if (obj instanceof Person) // 타입이 person이 아니면 값 비교할 필요 x
return id == ((Person)obj).id; // obj가 Object타입이므로 id값을 참조하기 위해 Person 타입으로 형변환 필요
// id의 값을 비교함
else
return false; // 타입이 person이 아니면 값 비교할 필요 x
}
Person(long id) {
this.id = id;
}
}
public class EqualsEx2 {
public static void main(String[] args) {
Person p1 = new Person(1L);
Person p2 = new Person(1L);
if(p1==p2)
System.out.println("p1과 p2는 같은 사람");
else
System.out.println("p1과 p2는 다른 사람"); // 주소가 다름
if(p1.equals(p2))
System.out.println("p1과 p2는 같은 사람"); // 오버라이딩한 equlas()는 멤버변수 값을 비교하므로 같은 값
else
System.out.println("p1과 p2는 다른 사람");
}
}