[작성일: 2023. 02. 02]
Object 클래스
- 모든 클래스의 최고 조상
- 오직 11개의 메서드만을 가지고 있음.
- notify(), wati() 등은 스레드와 관련된 메서드.
- protected는 오버라이딩 해서 public으로 변경해야 사용할 수 있음.
object 클래스의 메서드 | 설명 |
protected Object clone() | 객체 자신의 복사본을 반환 |
public boolean equals(Object obj) | 객체 자신과 객체 obj가 같은 객체인지 알려줌.(같으면 true) |
protected void finalize() | 객체가 소멸될 때 가비지 컬렉터에 의해 자동적으로 호출 됨. 이때 수행되어야 하는 코드가 있을 때 오버라이딩 함. (거의 사용x) |
pulbic Class getClass() | 객체 자신의 클래스 정보(설계도 정보)를 담고 있는 Class 인스턴스 반환 |
public int hashCod() | 객체 자신의 해시코드를 반환 |
public String toString() | 객체 자신의 정보를 문자열로 반환 |
public void notify() | 객체 자신을 사용하려고 기다리는 쓰레드 하나를 깨움 |
public void notibyAll() | 객체 자신을 사용하려고 기다리는 모든 쓰레드를 깨움 |
public void wait() public void wait(long timeout) public void wait(long timeout, int nanos) |
다른 쓰레드가 notify()나 notifyAll()을 호출할 때까지 현재 쓰레드를 무한히 또는 지정된 시간(timeout, nanos) 동안 기다리게 함. imeout은 천 분의 1초, nanos는 10⁹분의 1초 |
equals(Object obj)
- 객체 자신(this)과 주어진 객체(obj)를 비교해서 같으면 true, 다르면 false 반환
- Object 클래스의 equals()는 객체의 주소를 비교(참조변수 값 비교)
class Ex9_1 {
public static void main(String[] args) {
Value v1 = new Value(10);
Value v2 = new Value(10);
if(v1.equlas(v2))
System.out.println("v1과 v2는 같습니다.");
else
System.out.println("v1과 v2는 다릅니다.");
} // main
}
class Value {
int value;
Value(int value) {
this.value = value;
}
// Object의 equals()를 오버라이딩해서 주소가 아닌 value를 비교하게 함.
public boolean equals(Object obj) {
if(!(obj instanceof Value)) return false;
Value v = (Value)obj; // obj를 value로 형변환 해줘야 함.
return this.value == v.value;
}
}
equals(Object obj)의 오버라이딩
- 인스턴스 변수(iv)의 값을 비교하도록 equals()를 오버라이딩 해야 함. (cv는 객체마다 공통이라서)
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;
}
}
hashCode()
- 객체의 해시코드(hash code)를 반환하는 메서드
- Object 클래스의 hashCode()는 객체의 주소를 int로 변환해서 반환
- 객체의 주소를 가지고 만들기 때문에 객체마다 다른 값을 가지고 있음.
- equals()를 오버라이딩 하면, hashCode()도 오버라이딩 해야 함. ➡️ equals()의 결과가 true인 두 객체의 해시코드는 같아야 하기 때문
- System.iedntityHashCode(Object obj)는 Object클래스의 hashCode()와 동일함.
public class Object {
...
public native int hashCode(); // 내용 없음
// native 메서드 : OS의 메서드(C언어)
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.out.println(System.iendtyHashCode(str1)); // 3526198
System.out.println(System.iendtyHashCode(str2)); // 7699183
toString(), toString()의 오버라이딩
- toString(): 객체를 문자열(String)로 변환하기 위한 메서드
public String toString() { // Object 클래스의 toString()을 오버라이딩
return getClass().getName() + "@" + Integer.toHexString(hashCode());
// 객체주소 값(해시코드)을 설계도객체.클래스이름+@(위치)+16진수 문자열로 바꿔서 출력
}
🐣 해당 게시글은 자바의 정석(남궁성 님) 영상으로 함께 공부하며 요약/정리한 글입니다.
🐣 입문 개발자가 작성한 글이므로 틀린 내용이나 오타가 있을 수 있습니다.