부모-자식 상속 관계에 있는 클래스에서 상위 클래스가 동일한 메시지로 하위 클래스들을 서로 다르게 동작시킨다.
다형성을 활용하면 부모 클래스가 자식 클래스의 동작 방식을 알수 없어도 오버라이딩을 통해 자식 클래스를 접근할 수 있다.다형성(polymorphism)이란 하나의 객체가 여러 가지 타입을 가질 수 있는 것을 의미
public class Test24PolyCar { //자동차에 대한 원형(슈퍼) 클래스
protected int speed=50;
public Test24PolyCar() {
System.out.println("나는 자동차야~~~");
}
public void dispData() {
System.out.println("속도 : "+speed);
}
public int getSpeed() {
return speed;
}
}
먼저 polycar라는 클래스를 만들었다.
public class Test24PolyBus extends Test24PolyCar{
private int passenger=10;
// 생성자 생략 - 생성자 속에 super();가 있음
public Test24PolyBus() {
super();
}
public void show() {
System.out.println("버스");
}
@Override //annotation 메타데이터
public void dispData() {
System.out.println("버스의 승객은 "+passenger);
System.out.println("버스의 속도는 "+speed);
}
}
Test24PolyBus 클래스는 Test24PolyCar 클래스를 상속받았다.
이때 super()가 들어간 생성자는 생략이 가능하지만 그냥 써줬다.
메소드 오버라이딩을 통해 disData()를 써줬다.
public class Test24PolyMain {
public static void main(String[] args) {
Test24PolyCar car1=new Test24PolyCar();
Test24PolyBus bus1=new Test24PolyBus();
System.out.println();
car1.dispData();
System.out.println(car1.getSpeed());
System.out.println();
bus1.dispData();
bus1.show();
System.out.println(bus1.getSpeed());
System.out.println("-------------");
Test24PolyCar car2=new Test24PolyBus(); //업캐스팅
car2.dispData(); //polycar 타입의 car2인데 bus내용이 출력
//car2.show(); //show는 오버라이딩이 안된 메소드여서(자식 고유 메소드라 호출불가). disData는 오버라이딩 된 메소드라 호출가능!!!
System.out.println(car2.getSpeed());
System.out.println();
//Test24PolyBus bus2=new Test24PolyCar(); //자식객체가 부모객체에게 줄 순 없다!!
//Test24PolyBus bus2=car1; //얘도 안됨
Test24PolyBus bus2=(Test24PolyBus)car2; //casting
// 위는 부모타입이지만 자식 객체의 주소를 가지므로 캐스팅이 가능하다.
bus2.dispData();
System.out.println(bus2.getSpeed());
bus2.show(); //결국 PolyBus는 다시 PolyBus가 됨
System.out.println();
Test24PolyCar polyCar=null;
Test24PolyBus polyBus=new Test24PolyBus();
polyCar=polyBus; //promotion
polyCar.dispData(); // 1 : 버스의 속도는 50
// 똑같은 걸 써도 결과가 달라질 수 있다. : 다향성
}
}
Test24PolyCar car1=new Test24PolyCar();
Test24PolyBus bus1=new Test24PolyBus();
코드들을 통해 car, bus 클래스에 각각 객체를 생성 및 호출하여
나는 자동차야~~~ 라는 문구가 두번 호출됨
위 코드들을 보면 Test24PolyBus 클래스는 Test24PolyCar 클래스를 상속받았다.
따라서 Test24PolyBus는 Test24PolyCar의 하위 클래스이다.