IT's 우

[Java] Object 클래스 본문

CS/Java

[Java] Object 클래스

디우 2023. 6. 1. 12:55
728x90

[Java] Object 클래스

Java의 최상위 클래스 = Object 클래스

따라서 자바의 모든 클래스는 Object 클래스의 모든 메소드를 바로 사용할 수 있다.

이러한 Object 클래스는 필드를 가지지 않으며, 총 11개의 메소드만으로 구성되어 있다.

 


Object Class가 갖고있는 메서드

메서드들은 기본적으로 각 API 클래스마다 자체적으로 오버라이딩을 통해 재정의되어 있다.


  • toString()
    • 해당 인스턴스에 대한 정보를 문자열로 반환
    • 이때 반한되는 문자열은 클래스 이름과 함께 구분자로 '@'가 사용되며, 그 뒤로 16진수 해시 코드(hash code)가 추가된다.
    • 16진수 해시 코드 값은 인스턴스의 주소를 가리키는 값으로, 인스턴스마다 모두 다르게 반환된다.
    Car car01 = new Car();
    ​
    Car car02 = new Car();
    ​
     
    ​
    System.out.println(car01.toString());
    ​
    System.out.println(car02.toString()); 
    • 실행 결과
      • Car@15db9742
      • Car@6d06d69c

 

  • hashCode()
    • 해당 객체의 해시 코드 값을 반환

wait(), notify(), notifyAll()을 무한 스레드의 cpu 점유율을 줄이기 위해 사용하게 되었다.

  • wait()
    • 갖고 있던 고유 lock 해제, Thread를 잠들게 함
    • 해당 객체의 다른 스레드가 notify()나 notifyAll() 메소드를 실행할 때까지 현재 스레드를 일시적으로 대기(wait)시킬 때 호출함.
    • wait(long timeout)
      • 해당 객체의 다른 스레드가 notify()나 notifyAll() 메소드를 실행하거나 전달받은 시간이 지날 때까지 현재 스레드를 일시적으로 대기(wait)시킬 때 호출함.
    • void wait(long timeout, int nanos)
      • 해당 객체의 다른 스레드가 notify()나 notifyAll() 메소드를 실행하거나 전달받은 시간이 지나거나 다른 스레드가 현재 스레드를 인터럽트(interrupt) 할 때까지 현재 스레드를 일시적으로 대기(wait)시킬 때 호출함.
  • notify()
    • 잠들던 Thread 중 임의의 하나를 깨움
  • notifyAll()
    • 잠들어 있던 Thread를 모두 깨움

wait, notify, notifyAll: 호출하는 스레드가 반드시 고유 락을 갖고 있어야 함.

  • Synchronized 블록 내에서 실행되어야 함.
  • synchronized(thread)
    {
       thread.wait();
    }
  • synchronized() 내의 객체와 wait나 notify 함수를 호출하는 객체는 같아야 한다.
  • 고유 락을 획득하지 않은 상태에서 위 메서드들 중 하나를 호출하면
    • IllegalMonirotStateException 발생

  • equals()
    • 해당 인스턴스를 매개변수로 전달받는 참조 변수와 비교하여, 그 결과를 반환.
    • 이때 참조 변수가 가리키는 값을 비교하므로, 서로 다른 두 객체는 언제나 false를 반환하게 된다.
    Car car01 = new Car();
    ​
    Car car02 = new Car();
    ​
     
    ​
    System.out.println(car01.equals(car02));
    ​
    car01 = car02; // 두 참조 변수가 같은 주소를 가리킴.
    ​
    System.out.println(car01.equals(car02));
    • 실행 결과
      • false
      • true

 

  • clone()
    • 해당 인스턴스를 복제하여, 새로운 인스턴스를 생성해 반환
    • 하지만 Object 클래스의 clone() 메소드는 단지 필드의 값만을 복사하므로, 필드의 값이 배열이나 인스턴스면 제대로 복제할 수 없다.
    • 따라서 이러한 경우에는 해당 클래스에서 clone() 메소드를 오버라이딩하여, 복제가 제대로 이루어지도록 재정의해야 한다.
      • 배열이나 인스턴스인 필드는 복제되는 것이 아닌 해당 배열이나 인스턴스를 가리키는 주소값만이 복제

 

  • getClass()
    • 해당 객체의 클래스 타입을 반환

 

  • finalize()
    • 해당 객체를 더는 아무도 참조하지 않아 가비지 컬렉터가 객체의 리소스를 정리하기 위해 호출함.
    • 자동으로 실행되는 해당 메서드를 사용자가 원할 경우 직접 오버라이딩하여 사용
package Finalize;
​
public class check {
  private int checkNum;
  
  public check(int checkNum) {
    this.checkNum =checkNum;
  }
  
  @Override
  protected void finalize() throws Throwable {
    System.out.println(checkNum + "에 있는 finalize()실행");
  }
}

[참고자료]

728x90
반응형

'CS > Java' 카테고리의 다른 글

[java] 추상 클래스와 인터페이스 차이  (0) 2023.07.14
[java] final vs finally vs finalize  (0) 2023.06.30
[Java] == 와 equals 차이  (1) 2023.06.15
[Java] String vs Char 차이  (1) 2023.06.15
[Java]문자열 클래스  (0) 2023.06.01