Object 는 모든 클래스의 부모 클래스이다. 따라서 Object 는 모든 객체를 참조할 수 있다. 예제를 통해서 Object 의 다형성에 대해 알아보자.

Dog 와 Car 은 서로 아무런 관련이 없는 클래스이다. 둘다 부모가 없으므로 Object 를 자동으로 상속 받는다.
package lang.object.poly;
class Car {
public void move() {
System.out.println("자동차 이동");
}
}
package lang.object.poly;
class Dog {
public void sound() {
System.out.println("멍멍");
}
}
package lang.object.poly;
public class ObjectPolyExample1 {
public static void main(String[] args) {
Dog dog = new Dog();
Car car = new Car();
action(dog);
action(car);
}
private static void action(Object obj) {
//obj.sound(); //컴파일 오류, Object는 sound()가 없다.
//obj.move(); //컴파일 오류, Object는 move()가 없다.
//객체에 맞는 다운캐스팅 필요
if (obj instanceof Dog dog) {
// -> 선언해주면 이 타입으로 자동 다운캐스팅
dog.sound();
} else if (obj instanceof Car car) {
car.move();
}
}
}
멍멍
자동차 이동
Object 는 모든 타입의 부모다. 부모는 자식을 담을 수 있으므로 앞의 코드를 다음과 같이 변경해도 된다.
Object dog = new Dog(); //Dog -> Object
Object car = new Car(); //Car -> Object
action(Object obj) 메서드를 분석해보자.
이 메서드는 Object 타입의 매개변수를 사용한다. 그런데 Object 는 모든 객체의 부모다. 따라서 어떤 객체든지 인자로 전달할 수 있다.
action(dog) //main에서 dog 전달
void action(Object obj = dog(Dog)) //Object는 자식인 Dog 타입을 참조할 수 있다.
action(car) //main에서 car 전달
void action(Object obj = car(Car)) //Object는 자식인 Car 타입을 참조할 수 있다.
action(dog) //main에서 dog 전달
private static void action(Object obj) {
obj.sound(); //컴파일 오류, Object는 sound()가 없다.
}