상속의 특징이며 여러가지 형태를 가질수 있는 능력을 의미한다.
1. 참조 변수 타입 변환을 활용해서 다형성을 구현할 수 있다.
2. 매개변수에도 다형성이 적용될 수 있다.
public Car(Tire tire) {
this.tire = tire;
}
Car car1 = new Car(new KiaTire("KIA"));
//위 코드는
//Tire kia = new KiaTire("KIA"); //자동타입변환
//Car car1 = new Car(kia); 이 두줄과 같다.
Tire getHankookTire() { //반환타입은 부모클래스인 Tire
return new HankookTire("HANKOOK"); //return은 자식타이어 객체
}
위에서 말한 참조변수 타입변환이 무엇인지 알아보자.
부모타입 변수 = 자식타입 객체; 에서는 부모타입으로 자동으로 변환이 일어난다.
부모 멤버를 자식객체가 상속받기 때문에 부모와 동일하게 취급될 수 있다.
다만 주의할 점은 부모 타입 변수로 자식 객체의 멤버에 접근할 때는 부모 클래스에 선언된 즉, 상속받은 멤버만 접근할 수 있습니다.
예를 들자면 포유류와 고래가 있다고 생각해보자
포유류는 모유수유를 하는 메서드가 있고,
고래는 포유류의 자식클래스이며, 수영을 하는 메서드도 가지고 있다고 가정한다.
public class Main {
public static void main(String[] args) {
// 고래는 포유류이기 때문에 포유류 타입으로 자동 변환
Mammal mammal = new Whale();
// mammal.swimming(); // 오류 발생
//포유류에는 swimming 메서드가 없기때문
// 반대로 모든 포유류가 전부 고래 처럼 수영이 가능한 것이 아니기 때문에 타입변환 불가능
// Whale whale = new Mammal(); //오류
mammal.feeding(); //모유수유 메서드는 부모클래스에서 상속한 멤버이기때문에 사용가능
//고래는 모유수유를 합니다. 가 출력된다.
}
}
쉽게 말해서 부모타입변수 -> 자식 객체의 멤버였던것을 자식타입으로 다시 되돌리는 것을 말한다.
자식타입 변수 = (자식타입) 부모타입객체;
부모타입객체는 자식타입변수로 자동변환이 되지않으므로 캐스팅을 사용하여 강제로 변환시켜주는 것이다.
하지만 부모타입변수로 아예 생성자를 만들어놓고 자식 타입으로 변환시키는 것은 불가능하다.
Mammal newMammal = new Mammal();
Whale newWhale = (Whale) newMammal; // ClassCastException 발생
위 자동 타입변환의 예제에서 수영을 호출하지 못했을 때 처럼 자식클래스 안의 고유한 멤버를 사용하기 위해서는 강제타입변환을 해야한다고 생각하면 된다.
다형성 기능으로 인해 해당 클래스 객체의 원래 클래스명을 체크하기 위해 필요한 명령어이다.
( 어떤 인스턴스가 어떤 클래스의 설계도로 만들어졌는지를 체크 )
{대상 객체} instance of {클래스 이름} 의 형태로 사용하며 응답값은 boolean이다.
class Parent { }
class Child extends Parent { }
public class Main {
public static void main(String[] args) {
Parent pc = new Child(); // 다형성 허용 (자식 -> 부모)
System.out.println(pc instanceof Object); // true
//object는 최상단 클래스이기 때문에 무조건 true라고보면된다.
System.out.println(pc instanceof Parent); // true
System.out.println(pc instanceof Child); // true
//자식과 부모를 모두 다형성을 허용하여 생성했기때문에
Parent p = new Parent();
System.out.println(p instanceof Object); // true
System.out.println(p instanceof Parent); // true
System.out.println(p instanceof Child); // false
//p는 parent이기 때문에
Parent c = new Child();
System.out.println(c instanceof Object); // true
System.out.println(c instanceof Parent); // true
System.out.println(c instanceof Child); // true
}
}