자바에서 모든 클래스의 최상위 부모 클래스는 java.lang.Object입니다.
Object 클래스는 자바의 모든 객체에 대한 기본적인 메서드와 기능을 제공합니다.
아래는 Object 클래스의 정의 코드입니다.
package java.lang;
public class Object {
public Object() {
}
public boolean equals(Object obj) {
return (this == obj);
}
public final native Class<?> getClass();
public int hashCode() {
return System.identityHashCode(this);
}
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
//@ : synbol table의 index를 만드는데, index가 함수명과 파라미터
}
protected native Object clone() throws CloneNotSupportedException;
//클래스 복사와 객체 복사가 있는데 이건 객체 복사
public final native void notify(); //native method, c++ 함수를 당겨 쓰는 것.
public final native void notifyAll();
public final void wait() throws InterruptedException {
wait(0);
}
public final native void wait(long timeout) throws InterruptedException;
public final void wait(long timeout, int nanos) throws InterruptedException {
if (timeout < 0) {
throw new IllegalArgumentException("timeout value is negative");
}
if (nanos < 0 || nanos > 999999) { //nanos : nano second의 약자
throw new IllegalArgumentException(
"nanosecond timeout value out of range");
}
if (nanos >= 500000 || (nanos != 0 && timeout == 0)) {
timeout++;
}
wait(timeout);
}
protected void finalize() throws Throwable {
}
}
equals(Object obj): 이 메서드는 현재 객체와 주어진 객체(obj)가 동일한지를 비교합니다. 기본적으로는 두 객체의 레퍼런스를 비교하며, 객체의 내용을 비교하기 위해 해당 클래스에서 이 메서드를 오버라이딩할 수 있습니다.
getClass(): 이 메서드는 현재 객체의 클래스에 대한 정보를 반환합니다. 반환된 값은 Class 객체이며, 클래스에 대한 다양한 정보를 얻을 수 있습니다. (Class class는 메타 데이터를 저장하기 위한 용도로 사용)

hashCode(): 이 메서드는 현재 객체의 해시 코드를 반환합니다. 해시 코드는 객체의 고유한 정수 식별자로 사용됩니다. (java코드는 hash코드를 가지고 있다. 이것은 key.)
toString(): 이 메서드는 현재 객체를 문자열로 표현하여 반환합니다. 기본적으로는 객체의 클래스 이름과 해시 코드를 조합하여 반환합니다.
clone(): 이 메서드는 현재 객체의 얕은 복사본을 생성하여 반환합니다. Cloneable 인터페이스를 구현한 클래스에서만 사용할 수 있습니다.
notify(), notifyAll(): 이 두 메서드는 스레드 동기화를 위해 사용되는 메서드입니다. wait() 메서드로 대기 중인 스레드에게 신호를 보내어 실행을 재개시킵니다.
wait(), wait(long timeout), wait(long timeout, int nanos): 이 세 가지 메서드는 스레드 동기화를 위해 사용되는 메서드입니다. 스레드를 대기 상태로 전환하고 다른 스레드에 의해 신호를 받을 때까지 대기합니다.
finalize(): 이 메서드는 객체가 가비지 컬렉터에 의해 수집되기 전에 호출되는 메서드입니다. 객체의 종료 작업을 수행하는 데 사용될 수 있습니다.
Object 클래스는 모든 클래스에서 상속되기 때문에, 위에서 설명한 메서드와 기능은 자바의 모든 객체에서 사용할 수 있습니다. 클래스가 별도의 상위 클래스를 상속하지 않는다면, Object 클래스가 자동으로 상속됩니다.
native 키워드는 해당 메서드가 네이티브 코드로 구현되었음을 나타냅니다.
따라서 notify() 메서드의 실제 구현은 자바 소스 코드가 아닌 다른 언어로 작성된 네이티브 코드에 존재합니다.
notify() 메서드는 스레드 동기화를 위한 메서드로, 자바 가상 머신(JVM)의 스레드 스케줄러에게 현재 객체에 대한 신호를 보내어 대기 중인 스레드를 깨우는 역할을 합니다.
notify() 메서드의 네이티브 구현은 각각의 JVM 구현체(예: HotSpot JVM-HotSpot은 C++로 구현되었음)에서 제공되며, 해당 구현체의 네이티브 코드에서 실제로 동작합니다.
네이티브 메서드의 구현은 플랫폼 또는 JVM의 구현체에 따라 다르므로, 네이티브 메서드의 바디는 해당 JVM의 내부 코드나 외부 네이티브 라이브러리에 위치할 수 있습니다.
이러한 네이티브 구현은 JVM에 의해 자동으로 로드되고 사용됩니다.