다형성은 클래스의 상속관계에서 오는 인스턴스의 호환성을 적극 활용할 수 있는 기능으로 수퍼클래스가 같은 인스턴스를 한번에 관리하거나 인터페이스를 구현하여 사용하는 코드에서도 이용된다.
상위 자료형인 수퍼클래스로 변환한다
var a: Drink=Cola()
Up-Casting을 다시 하위 자료형으로 변환한다.
별도의 연산자(캐스팅 연산자) 필요
fun main() {
// 업 캐스팅
var a = Drink()
a.drink()
// 업 캐스팅
var b:Drink = Cola()
b.drink()
// 다운캐스팅
if(b is Cola)
{
b.washDishes()
}
// 다운캐스팅
var c = b as Cola
c.washDishes()
b.washDishes() // as를 사용하면 반환값 뿐만 아니라 변수 자체도 다운캐스팅 되기 때문에 에러가 나지 않음
}
open class Drink {
var name = "음료"
open fun drink() {
println("${name}을 마십니다")
}
}
class Cola: Drink() {
var type = "콜라"
override fun drink() {
println("${name}중에 ${type}을 마십니다.")
}
fun washDishes() {
println("${type}로 설거지를 합니다")
}
}
음료을 마십니다
음료중에 콜라을 마십니다.
콜라로 설거지를 합니다
콜라로 설거지를 합니다