티스토리 뷰

IT/개발

Object class

K.Nero 2017. 2. 1. 19:26

Object class는 자바에서 기본적으로 상속을 받는 클래스로 항상 사용은 하고 있지만 Object 의 메소드는 자주 사용하지 않아서 정확한  사용방법을 모르는 경우가 많다. 나도 정확히 모르는 부분이 있어서 java API와 실제 구현 소스를 보고 정리를 해 보았다.

참고 API URL : https://docs.oracle.com/javase/7/docs/api/java/lang/Object.html

public native final Class<?> getClass()
객체의 런타임 class를 반환해 준다. 이 반환되는 Class object는 static syncronized methods에 의해서 잠겨있다.

public native int hashCode()
이 메소드는 각 객체의 hashCode를 만드는데 사용되는데 이 메소드는 HashMap과 같은 객체에서 key를 정의하는데 사용된다. 하지만 HashMap에서 사용할 경우에는 hashCode값 많을 사용하는 것은 아니고 equals()와 여러 다른 방법이 같이 사용된다. 

public boolean equals(Object object)
두 개의 객체가 동일한 지를 판별하는 메소드이며 Object의 equals는 this == object 로만 구현되어 있는데 이것은 각 객체의 주소값이 같은 지를 검사하는 것이므로 자기 자신일 경우에만 true가 반환되게 된다. equals를 override하면 내가 원하는 조건으로 같은 객체를 구별할 수 있다.

protected Object clone() throws CloneNotSupportedException
현재 객체를 복사하여 새로운 객체를 반환해 준다. 여기서 복사라는 말이 중요한데 새로 생성된 객체는 다른 주소값을 할당 받아서 만들어 지기 때문에 완전히 다른 객체지만 내부에 사용 중인 멤버 변수 중 primitive type이 아닌 reference type일 경우 같은 멤버 변수를 사용하게 된다(주소값을 그대로 복사했기 때문에). 또한 이 메소드는 사용하려는 객체가 Cloneable을 implements 하지 않을 경우 CloneNotSupprtedException을 발생시키게 된다.

public String toString()
이 메소드는 여러모로 유용하게 사용될 수 있는 메소드로 각 객체를 String으로 표현할 수 있게 해준다. 기본기능으로 사용하게 되면 getClass().getName() + "@" + Integer.toHexString(hashCode())로 표현되게 된다. 이 메소드는 System.out.println()나 로그를 기록할 경우에도 자동으로 toString()을 사용하며 가장 유용한 부분 중 하나는 디버깅시에 tooltip 및 Expression(Eclipse 사용 시) 바로 보이기 때문에 쉽게 확인할 수 있다.

public final native void notify()
자바에서는 monitor 락을 사용하게 되는데 이 메소드는 현재 이 객체의 monitor에 의해서 대기 중인 thread 중 하나를 깨워준다. 여러 thread가 wait상태라면 그 중 하나가 깨어나게 되며 어떤 thread가 깨어날 지는 알 수 없다.(오직 하나의 thread 만이 해당 객체의 monitor를 소유할 수 있다.) 일반 적으로 동기화 관련 처리(synchronized 문구 등)에서 사용된다.

public final native void notifyAll()
이 객체의 monitor에 의해서 대기 중인 모든 thread를 깨우게 된다. 재개 된 thread는 현재 thread가 해당 락을 놓을 때 까지 진행할 수 없으며 다른 thread 들과 경쟁하게 된다.

public final native void wait(long timeout) throws InterruptedException
이 메소드를 호출하게 되면 해당 thread는 다른 thread가 notify(), notifyAll()을 호출 하거나 interrupt를 호출 할 때까지 대기하게 된다. 그리고 timeout 설정에 의해서 설정한 시간까지 대기하게 되지만 0을 설정한다면 timeout은 작동하지 않는다.

public final void wait(long timeout, int nanos) throws InterruptedException
기본적인 동작은 wait(long timeout)과 동일하며 파라미터인 nanos에 의해서 timeout이 변하게 되는데 조건은 (nanos >= 500000 || (nanos != 0 && timeout == 0)) 의 결과가 만족되면 timeout을 1 증가 시킨다.

public final void wait() throws InterruptedException
내부적으로 wait(0)을 호출한다.

protected void finalize() throws Throwable
이 메소드는 GC의 처리 대상(더 이상 이 객체의 참조가 없으면) GC가 실행하게 된되며 하위 메소드가 override하여 GC 처리 시 원하는 처리를 실행할 수 있다. 메소드 실행 과정에서 에러가 발생할 경우 에러는 무시되지만 이 객체에 throw된 예외가 있을 경우 객체의 종료가 중지 된다. 그리고 
사용자가 볼 수 있는 동기화 잠금을 보유하지 않는다.

이 method들 중 wait(), notify(), notifyAll()의 경우에는 사용할 때 synchronized를 사용해 줘야 한다.

synchronized(object)
{
    try
    {
        object.wait();
    }
    catch(InterruptedException e)
    {
        e.printStackTrace();
    }
}

만약 위와 같이 사용하지 않을 경우 java.lang.IllegalMonitorStateException 가 발생하게 된다.


'IT > 개발' 카테고리의 다른 글

Github 에 개인 maven repository 생성하기  (0) 2018.02.14
Garbage Collection  (0) 2017.02.04
Socket Option  (0) 2016.01.02
IO / NIO  (0) 2016.01.01
Java Architecture  (0) 2015.12.16
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함