자바에서 예외적으로 Strongly typed language 가 적용되지 않는 경우가 있다.
상속관계에서 자식 클래스가 부모 클래스 타입으로 참조되는것이 허용되며 이를 up-casting 이라고 한다.
한번 부모 클래스 타입의 클래스로 참조가 이루어진 이후 다시 자식 클래스로 참조하는 것을 down-casting 이라고 한다.
up-casting은 상속관계에서 자식 객체가 부모 객체의 성향을 띄게 하는 것이고
down-casting은 up-casting이 되어있다는 전제하에 다시 원래 관계로 돌아가는 것이다.
상속관계가 성립되어 있고 자식 클래스의 인스턴스가 부모 클래스 타입의 변수로 참조되면(upcasting) 실제 인스턴스화 객체가 자식 객체일 경우에도 자식 클래스가 갖고 있는 인스턴스 메소드는 호출 할 수 없다.
부모 클래스 타입의 변수로 참조하고 있는 자식 인스턴스 객체의 메소드를 호출하기 위해서는 down-casting 이 이루어져야한다.
단, 재정의 하고 있는 메소드의 경우 up-casting 상황에서도 자식 클래스의 재정의 메소드가 호출된다.
상속관계에서 객체간의 타입 형변환은 객체를 관리하는데 있어 큰 이점이 있다.
자식 클래스가 부모 클래스 타입의 변수로 참조가 가능하기 때문에 같은 부모 클래스를 상속하는 모든 자식 클래스들을 하나의 타입으로 관리할 수 있다.
이로써 같은 객체의 관리는 프로그램의 복잡성을 크게 개선할 수 있다.
즉 사진과 같이 그림판 프로그램의 작동방식처럼 그림의 겹침을 구현하기 위해 따로 시퀀스라는 컬렉션을 생성하여 그림의 순서를 만들 필요 없이, Shapes의 참조변수인 4바이트짜리 공간을 여러개 생성하여 index로 접근하는 방법이 가능하다.
ex)
Shapes S = new Rectangles;
Shapes S2 = new Ellipses;
// ...
다형성(polymorphism)은 하나의 객체가 다양한 형태로 처리될 수 있는 특성을 말한다.
다형성을 구현하기 위해서는
다형성의 이형 집합을 통한 구현 방식과 파라미터를 통한 구현 방식으로 구분할 수 있다.
위의 코드에서 업캐스팅을 발생시키고, for 문으로 Shape[] 안의 자식 클래스들을 호출한다.