즉 모든 객체는 Object를 상속받고 있다는 것으로 클래스를 작성할 때 명시적으로 상속을 받지 않으면 바로 Object 클래스를 자동으로 상속받게 된다
만약 명시적으로 상속을 받게 되면? 상속한 부모 클래스를 타고 올라가보면 결국 Object 클래스가 존재한다
public class Parent {
public void parentMethod() {
System.out.println("Parent.parentMethod");
}
}
Parent 클래스는 명시적으로 상속을 받고 있지 않기 때문에 Object 클래스를 상속받게 된다
public class Child extends Parent {
public void childMethod() {
System.out.println("Child.childMethod");
}
}
public class ObjectMain {
public static void main(String[] args) {
Child child = new Child();
child.childMethod();
child.parentMethod();
String string = child.toString();
System.out.println(string);
}
}
ObjectMain의 main 메서드를 실행하게 되면 child 인스턴스에서 childMethod() 와 parentMethod()를 호출할 수 있다
근데 위에서 선언하지 않은 toString() 이라는 메서드 또한 호출할 수 있는 것을 알 수 있다
이 toString() 메서드가 바로 Object 클래스가 제공하는 메서드인 것이다
의존 관계를 살펴보면 다음과 같다.
Child 타입 child는 참조하는 인스턴스의 가장 하위 클래스부터 toString() 메서드가 존재하는지 확인한다
없다면 부모 클래스로 올라가서 확인한다
Object 클래스에 toString() 메서드가 있는 것을 확인하고 Object.toString() 을 호출하게 된다
그렇다면 왜 Object 클래스가 최상위 부모 클래스가 되어야 했을까?
공통 기능 목적의 제공
다형성의 기본 구현
공통 기능 목적의 제공
객체의 정보를 출력한다
객체와 객체를 비교한다
객체가 어떤 클래스로부터 만들어졌는지 확인한다
등등
객체라면 활용할 수 있는 공통적인 기능들이 있을텐데, Object 클래스에 해당 기능들을 구현해두고 이를 자동으로 상속받게 함으로써 공통 기능을 모든 객체에서 활용할 수 있게 된다
toString() , equals() , hashCode() 등과 같은 메서드들이 이에 해당한다
다형성의 기본 구현
부모 클래스 타입은 자식 클래스 객체를 참조할 수 있다.
Object는 최상위 부모 클래스이기 때문에 모든 객체를 참조할 수 있게 된다. 이를 통해서 다양한 타입의 객체를 통합적으로 처리할 수 있게 해준다
메서드를 통한 다형적 참조
public class Person {
public void run() {
System.out.println("달린다");
}
}
public class Bird {
public void fly() {
System.out.println("난다");
}
}
public class ObjectMain {
public static void main(String[] args) {
Person p = new Person();
Bird b = new Bird();
action(p);
action(b);
}
private static void action(Object obj) {
}
}
다음과 같이 Object를 매개변수의 타입으로 설정해두면 인자로 어떤 객체든 들어갈 수 있다.
다만 이렇게 될 경우 obj에서 Person과 Bird의 메서드에 접근하지는 못한다.
만약 각 클래스의 메서드에 접근하고 싶다면 다운캐스팅이 필요하다
다형성을 제대로 활용하려면 '다형적 참조' + '메서드 오버라이딩'을 함께 사용해야하는데 그런면에서 Object는 클래스들이 활용할 수 있는 기본 메서드만 제공하고 있기에 Object를 활용한 다형성에는 한계가 있다
배열을 통한 다형적 참조
public class ObjectMain {
public static void main(String[] args) {
Person p = new Person();
Bird b = new Bird();
Object[] objs = {p ,b};
}
}