Java, Object 클래스

클래스들의 최상위 부모 클래스는 Object 클래스다.

Parent 와 Child 상속 관계인 클래스 예로, 부모인 Parent 클래스가 묵시적으로 Object 클래스으로부터 상속 받아 있다.

Parent.java

  • 상속 받은 클래스가 없다면 Object 클래스가 상속함
// 부모를 지정하지 않아도 묵시적으로 Object 클래스가 상속되어 있음
// 명시적 Object 상속: "public class Parent extends Object {..}"
public class Parent {

    public void pMethod() {
        System.out.println("Parent pMethod");
    }
}

Child.java

  • 다른 클래스를 상속하면 Object 클래스는 상속하지 않는다.
public class Child extends Parent {

    public void cMethod() {
        System.out.println("Child cMethod");
    }
}
💡
묵시적(Implicit): 개발자가 기술하지 않아도 시스템 또는 컴파일러가 자동으로 기술함
💡
명시적(Explicit): 개발자가 기술해야 작동함

Child 클래스의 자기 메시지와 상속 받은 Parent 메시지 출력해보기

ObjectMain.java

public class ObjectMain {
    public static void main(String[] args) {
        Child child = new Child();
        child.cMethod();
        child.pMethod();
    }
}

출력 결과

Child cMethod
Parent pMethod

toString

toString 키워드는 Object 클래스의 메소드이다
toString 키워드로 자신의 클래스명과 인스턴스에 정보를 출력해보도록 한다.

ObjectMain.java

public class ObjectMain {
    public static void main(String[] args) {
        Child child = new Child();

        // Object 클래스의 toString()
        String classInfo = child.toString();
        System.out.println(classInfo);
    }
}

출력 결과

object.Child@2f4d3709

출력 그림

Parent 는 Object가 상속 받았기에 Child 클래스 객체를 생성하면 메모리에도 함께 생성되어 있다.

  • Parent 클래스는 묵시적으로 Object 상속 받아 생성되어 있다.
  • Child 에서 toString() 메소드를 찾는다. Child 클래스에서 없으므로 부모에게 간다.
  • 부모 타입인 Parent 에서 찾지만 없다. 부모 타입으로 간다.
  • 부모 타입인 Object 에서 toString() 메소드를 찾았다. 이 메소드를 호출한다.

왜 Object 가 최상위 부모 클래스여야 하는가

Object 상속받아 사용하는 이유는 다음과 같다

  • 공통 기능 제공하기
  • 다형적인 기본 구현하기

공통 기능 제공하기

Object의 기본 기능 몇가지가 있다.

  • 객체의 정보를 제공하기. toString()
  • 다른 객체와 같은지 비교하기. equals()
  • 객체가 어떠한 클래스인지 확인하기. getClass()
  • 등등

이러한 기능을 매 클래스마다 메소드를 정의해서 사용한다면 번거로울 것이다. 그리고 개발자/프로젝트마다 서로 다른 이름을 만들어서 일관성을 잃을 수 있다.
누군가는 toString() 메소드 이름을 정의할 것이고 다른 누군가는 동일한 기능으로 objectInfo() 메소드 이름으로 만들 수 있다. 비교하는 메소드는 equals() 메소드를 누군가 same() 이름으로 만들면 알기가 어렵다.

Object 모든 객체가 필요한 공통 기능을 만들어져 있고, Object 클래스를 최상위 부모 클래스로 지정되어 있어 편리하게 공통 기능을 수행한다.

여담으로, 프로그래밍은 단순화하고, 일관성 있도록 공통 기능을 제공되어야 한다.

다형성의 기본 구현하기

앞서 작성한 코드를 읽었다면 알 수 있겠지만 Object 클래스는 모든 클래스의 부모 클래스로 지정되어있다. 모든 객체는 Object 클래스를 참조하여 다양한 타입의 객체를 통합되어 처리한다.

Object 클래스는 모든 객체를 다 담도록 되어있으니, 타입이 다른 객체를 보관해야 한다면 Object에게 보관하기도 한다.


Todo

추후에 다룰 Object의 메소드들이다.

  • clean() 객체를 복사할 때 사용하는 메소드
  • hashCode() 컬렉션 프레임워크를 다룰 때 사용하는 해쉬코드
  • getClass() 클래스를 정보를 가져오는 메소드
  • notify(), notifyAll(), wait() 멀티 쓰레드용 메소드