OOP의 4대 특징 중 하나로 여러 개의 형태를 가질 수 있는 능력 의미로 하나의 행동으로 여러가지 일을 수행한다는 개념이다.
자바에서 다형성이란 상속 관계에 있을 때 발현 되는 것으로 상위 클래스 타입의 레퍼런스 변수를 이용해 상속 받은 하위 클래스의 인스턴스를 참조할 수 있도록 허용하는 것이다.
다형성의 장점
기본형 변수와 같이 레퍼런스 변수또한 형변환이 가능하다.
단, 서로 상속관계에 있는 클래스사이에서만 가능하기 때문에 조상타입의 레퍼런스 변수를 자손타입의 레퍼런스 변수로의 형변환만 가능하다.
조상 타입의 레퍼런스로 후손의 객체를 참조할 수 있게 형 변환하는 것으로
자바에서 대입 연산자의 특성으로 인해 피연산자들은 무조건 자료형이 같아야 한다. 이는 객체를 생성할 때도 대입 연산자를 사용하기 때문에 동일한 자료형으로 변환해줘야하는데 기본형 변수와 같이 작은 자료형에서 큰 자료형의 형변환은 생략이 가능하다.
class TV {
public void turnOn() {}
public void turnOff() {}
}
class SamsungTV extends TV {
@Override
public void turnOn() {
super.turnOn();
}
@Override
public void turnOff() {
super.turnOff();
}
public void hiBixby(){}
}
부모 클래스인 TV 클래스와 자식 클래스인 SamsungTV가 있다.
TV tv1 = new SamsungTV();
부모 타입의 레퍼런스 변수에 자식 인스턴스를 담을 수 있다.
조상타입의 레퍼런스 변수를 자손타입의 레퍼런스 변수로 변환하는 것으로
업 캐스팅한 레퍼런스 변수들만 다운-캐스팅이 가능하다.
즉, 상속 관계에 있어야만 캐스팅이 가능하다.
((SamsungTV)tv1).hiBixby()
부모 클래스 타입의 tv1이 자식 클래스의 메서드를 사용
현재 레퍼런스 변수가 어떤 클래스 타입의 객체 주소를 참조하고 있는지 확인할 때 사용하는 연산자로 다운-캐스팅이 가능한지 확인하는 것과 같다.
최상위 조상 클래스 타입에 상속된 다양한 인스턴스 객체를 담았을 경우 각 인스턴스들의 메서드를 사용할 때 하나하나 명시적 다운-캐스팅이 불가능 하기에 instanceof 연산자를 사용한다.
if(tv1 instanceof SamsungTV){
((SamsungTV)tv1).hiBixby();
}