다형성은 사용 방법은 동일하지만 다양한 객체를 이용해서 다양한 실행결과가 나오도록 하는 성질
다형성을 구현하려먼 메소드 재정의와 타입 변환이 필요함
클래스의 변환은 상속 관계에 있는 클래스 사이에서 발생하며, 자식은 부모 타입으로 자동 타입 변환이 가능함
자동타입변환(promotion)은 프로그램 실행 도중에 자동적으로 타입 변환이 일어나는 것을 말함
자식은 부모의 특징과 기능을 상속받기 때문에 부모와 동일하게 취급될 수 있다는 것이 자동 타입 변환의 개념
바로 위의 부모가 아니더라도 상속 계층에서 상위 타입이라면 자동 타입 변환이 일어날 수 있다.
부모 타입으로 자동 타입 변환된 이후에는 부모 클래스에 선언된 필드와 메소드만 접근이 가능함
변수는 자식 객체를 참조하지만 변수로 접근 가능한 멤버는 부모 클래스 멤버로만 한정됨
그러나 메소드가 자식 클래스에서 재정의되었다면 자식 클래스의 메소드가 대신 호출됨
Tire 클래스가 Car 클래스와 같은 패키지에 있다고 가정하자. 그렇다면 Car 클래스는 Tire클래스를 사용할 수 있다. 그래서 Car 클래스에서 Tire클래스로 각 바퀴에 대한 객체를 만들었다. 바퀴의 수명이 다하면 새로운 객체로 바꿔주려고 한다. Tire 클래스를 부모 클래스로 하는 자식 클래스 Hankook과 kumho 를 만들고 타이어 교체시기가 되면 해당 위치의 타이어를 hankook이나 kumho 클래스로 새로운 객체를 만들어서 교체해줄 수 있다. 이때 hankook과 kumho 클래스의 roll을 재정의했을 경우 이전에 사용했던 roll과는 다르게 작동한다. 이렇게 다양한 자식 객체를 넣어 결과가 달라지는 것을 다형성이라고 한다.
매개 변수의 다형성은 매개값으로 어떤 자식 객체가 제공되느냐에 따라 메소드의 실행 결과가 다양해질 수 있다는 것
자식 객체가 부모의 메소드를 재정의 했다면 메소드 내부에서 재정의된 메소드를 호출함으로써 메소드의 실행결과는 다양해짐
강제 타입 변환 조건을 확인하지 않고 강제 타입 변환 시도 시 ClassCastException이 발생할 수 있다. 따라서 이전에 어떤 객체가 어느 클래스의 인스턴스인지 확인할 때 instanceof 연산자를 사용한다.
// 사용법
boolean result = 객체 instanceof 타입
// Parent가 부모 클래스고 Child가 자식 클래스라고 가정하자.
Parent parent = new Parent();
// parent라는 객체가 Child로부터 만들어진 객체인가?
parent instanceof Child // false // classcastexception 발생
// Child 객체가 자동 타입 변환으로 parent에 대입됨
Parent parent = new Child();
// 활용법
public void method(Parent parent){
// parent는 child 객체가 자동 타입 변환된 경우이므로 true
if (parent instanceof Child){
// 강제 타입 변환 조건에 맞으므로 강제 타입 변환 가능
Child child = (Child) parent;
}
}