Java 자바 Object 클래스와 메소드

Object 란?

자바에서 Object 클래스는 모든 클래스의 최상위 부모 클래스입니다. 모든 자바 클래스는 명시적으로 다른 클래스를 상속하지 않는 경우 Object 클래스를 자동으로 상속받습니다. 이로 인해 자바의 모든 클래스는 Object 클래스의 메소드를 상속받으며, 이를 통해 다양한 기능을 제공받을 수 있습니다. 이번 글에서는 Object 클래스의 특징과 주요 메소드에 대해 자세히 설명하겠습니다.

Object 클래스의 특징

  • 모든 클래스의 부모 클래스
    • 자바의 Object 클래스는 모든 클래스의 최상위 부모 클래스입니다. 명시적으로 다른 클래스를 상속하지 않는 모든 클래스는 암묵적으로 Object 클래스를 상속받습니다. 이를 통해 자바는 일관된 타입 계층 구조를 유지하며, 모든 객체는 Object 클래스로부터 파생된 공통 메소드를 사용할 수 있습니다.
  • 공통 메소드 제공
    • Object 클래스는 모든 자바 객체에서 사용할 수 있는 몇 가지 공통 메소드를 제공합니다. 이 메소드들은 객체의 기본 동작을 정의하며, 모든 객체가 공통적으로 사용할 수 있습니다. 주요 메소드로는 equals(), hashCode(), toString(), clone(), getClass(), notify(), notifyAll(), wait() 등이 있습니다.
  • 타입 캐스팅 및 다형성 지원
    • 모든 클래스가 Object 클래스를 상속 받기 때문에, 모든 객체는 Object 타입으로 캐스팅할 수 있습니다. 이를 통해 다양한 타입의 객체를 하나의 컬렉션에 저장하거나, 메소드 파라미터로 전달할 때 다형성을 지원할 수 있습니다. 이는 자바의 다형성을 지원하는 중요한 메커니즘입니다.

Object 클래스의 주요 메소드

Object 클래스에는 여러 유용한 메소드가 포함되어 있습니다. 여기서는 자주 사용되는 주요 메소드들을 설명하겠습니다.

equals(Object obj)

equals 메소드는 두 객체가 같은지를 비교합니다. 기본적으로 동일한 객체인지 확인하지만, 이 메소드를 오버라이딩하여 객체의 특정 속성을 기준으로 비교할 수 있습니다. 기본 구현은 객체의 메모리 주소를 비교하지만, 객체의 상태를 비교하려면 오버라이딩이 필요합니다. 예를 들어, MyClass의 attribute 속성을 기준으로 비교할 수 있습니다.

Java
@Override
public boolean equals(Object obj) {
    // 자신과 비교하면 항상 true를 반환합니다.
    if (this == obj) {
        return true;
    }
    // 비교할 객체가 null이거나, 클래스 타입이 다르면 false를 반환합니다.
    if (obj == null || getClass() != obj.getClass()) {
        return false;
    }
    // 비교할 객체를 현재 클래스 타입으로 캐스팅합니다.
    MyClass myClass = (MyClass) obj;
    // attribute 필드를 기준으로 비교합니다.
    return attribute == myClass.attribute;
}
Java

hashCode()

hashCode 메소드는 객체의 해시 코드를 반환합니다. 이 메소드는 해시 기반 컬렉션 (예: HashMap, HashSet)에서 사용됩니다. equals 메소드를 오버라이딩할 때는 hashCode 메소드도 오버라이딩해야 합니다. 동일한 객체는 동일한 해시 코드를 가져야 합니다.

Java
@Override
public int hashCode() {
    // Objects.hash 메소드를 사용하여 attribute 필드의 해시 코드를 반환합니다.
    return Objects.hash(attribute);
}
Java

toString()

toString 메소드는 객체의 문자열 표현을 반환합니다. 이 메소드를 오버라이딩하여 객체의 상태를 사람이 읽기 쉬운 형태로 반환할 수 있습니다. 디버깅이나 로깅 시 객체의 현재 상태를 쉽게 확인할 수 있습니다.

Java
@Override
public String toString() {
    // 객체의 필드 정보를 문자열로 반환합니다.
    return "MyClass{" +
            "attribute=" + attribute +
            '}';
}
Java

clone()

clone 메소드는 객체의 복제본을 생성합니다. 이 메소드를 사용하려면 Cloneable 인터페이스를 구현해야 합니다. 기본 구현은 얕은 복제를 수행하며, 깊은 복제가 필요하다면 이 메소드를 오버라이딩해야 합니다.

Java
@Override
protected Object clone() throws CloneNotSupportedException {
    // 기본 clone 메소드를 호출하여 객체를 복제합니다.
    return super.clone();
}
Java

getClass()

getClass 메소드는 객체의 런타임 클래스 정보를 반환합니다. 이 메소드는 일반적으로 객체의 클래스 타입을 확인하거나 로깅, 디버깅 목적으로 사용됩니다.

Java
public void printClassName() {
    // 객체의 런타임 클래스 이름을 출력합니다.
    System.out.println(this.getClass().getName());
}
Java

notify(), notifyAll(), wait()

이들 메소드는 스레드 간의 동기화를 위해 사용됩니다. wait 메소드는 현재 스레드를 일시 정지시키고, notify와 notifyAll 메소드는 대기 중인 스레드를 깨웁니다. 이 메소드들은 동기화된 블록이나 메소드 내에서 호출되어야 합니다.

Java
synchronized void exampleMethod() {
    // 동기화 블록 내부에서 notify 메소드를 호출합니다.
    notify(); // 대기 중인 스레드 중 하나를 깨웁니다.
    // notifyAll(); // 대기 중인 모든 스레드를 깨웁니다.
}
Java

결론

Object 클래스는 자바에서 매우 중요한 역할을 합니다. 모든 클래스의 최상위 부모 클래스인 Object 클래스는 자바의 일관된 타입 계층 구조를 유지하고, 객체 간의 기본적인 동작을 정의하는 메소드를 제공합니다. 이를 통해 다양한 기능을 쉽게 구현할 수 있으며, 다형성과 타입 캐스팅을 지원하여 유연한 프로그래밍을 가능하게 합니다.

특히, equals, hashCode, toString, clone, getClass, notify, notifyAll, wait와 같은 메소드는 자바 개발자들이 자주 사용하는 메소드들로, 객체 비교, 해시 코드 생성, 객체 상태 출력, 객체 복제, 클래스 정보 조회, 스레드 동기화 등의 기능을 제공합니다. 이러한 메소드들을 올바르게 이해하고 활용함으로써 보다 효율적인 자바 프로그램을 작성할 수 있습니다.

Leave a Comment