> For the complete documentation index, see [llms.txt](https://heunnajo.gitbook.io/java/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://heunnajo.gitbook.io/java/java.lang-package-and-useful-class/object-class.md).

# Object class

* **Object class**

: 모든 클래스의 최고 조상. 오직 11개의 메서드만을 가지고 있다.

| Object class method                                                                                            | Desc                                                                                                                                                                                     |
| -------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **protected** Object clone()                                                                                   | <p><strong>protected</strong> : 오버라이딩해서 public으로 바꿔줘야 쓸 수 있다.</p><p>객체 자신의 복사본을 반환한다.</p>                                                                                                |
| public boolean equals(Object obj)                                                                              | 객체 자신과 객체 obj가 같은 객체인지 알려준다.(같으면 true)                                                                                                                                                   |
| **protected** void finalize()                                                                                  | <p><strong>protected</strong> : 오버라이딩해서 public으로 바꿔줘야 쓸 수 있다.</p><p>생성자(객체 초기화) 와 반대되는 개념.</p><p>객체가 소멸될 때 가비기 컬렉터에 의해 자동적으로 호출된다. 이때 수행되어야하는 코드가 있을 때 오버라이딩한다. (메모리 문제로 인해 거의 사용안함)</p> |
| public Class getClass()                                                                                        | 객체 자신의 클래스 정보를 담고 있는 Class 인스턴스를 반환한다. Reflection API는 Class 인스턴스(설계도 객체)를 통해 객체 생성, 객체 정보를 얻을 수 있다.=>실행 중에 객체 생성                                                                        |
| public int hashCode()                                                                                          | 객체 자신의 해시코드를 반환한다.                                                                                                                                                                       |
| public String toString()                                                                                       | 객체 자신의 정보를 문자열로 반환한다.                                                                                                                                                                    |
| public void notify()                                                                                           | 객체 자신을 사용하려고 기다리는 쓰레드를 하나만 깨운다.                                                                                                                                                          |
| public void notifyAll()                                                                                        | 객체 자신을 사용하려고 기다리는 모든 쓰레드를 깨운다.                                                                                                                                                           |
| <p>public void wait()</p><p>public void wait(long timeout)</p><p>public void wait(long timeout, int nanos)</p> | 다른 쓰레드가 notify()나 notifyAll()을 호출할 때까지 현재 쓰레드를 무한히 또는 지정된 시간(timeout, nanos)동안 기다리게 한다. (timeout은 천 분의 1초, nanos는 10^9분의 1초)                                                             |

* equals(Object obj)

: 객체 자신(this)과 주어진 객체(obj)를 비교한다. 같으면 true, 다르면 false.

Object 클래스의 equals()는 객체의 주소를 비교한다.(참조변수 값 비교)

오버라이딩해서 사용해야한다.

```java
class Person {
    long id;
    //equals는 주소값만을 비교하기 때문에
    //값을 비교하도록
    //equals를 오버라이딩한다.
    public boolean equals(Object obj) {
        //Object에는 비교하고자하는 id값이 없기 때문에
        //형변환 필요.
        //1. 형변환 가능 여부 먼저 확인.
        if(obj instanceof Person)//형변환 가능하다면(참이면)
            return id == ((Person)obj).id;//형변환하여 비교 결과를 리턴!
        else
            return false;
    }
    
    Person(long id) {
        this.id = id;
    }
}
```
