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

스크린샷 2025-03-09 오후 7.00.38.png

DogCar 은 서로 아무런 관련이 없는 클래스이다. 둘다 부모가 없으므로 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()가 없다.
}