8.5 타입 캐스팅
부모 클래스로부터 상속된 자식 클래스는 자기 자신의 타입이기도 하면서, 동시에 부모 클래스의 타입이기도 합니다. 이때문에 자식 클래스는 본래의 타입 대신 부모 클래스 타입으로 선언하여 사용할 수 있습니다.
class Vehicle {
var currentSpeed = 0.0
func accelerate() {
self.currentSpeed += 1
}
}
class Car: Vehicle {
var gear: Int {
return Int(self.currentSpeed / 20) + 1
}
func wiper() {
// 창을 닦습니다
}
}
let trans: Vehicle = Car()
마지막 구문에서 상수로 선언된 trans는 Car 클래스의 인스턴스를 할당받지만 Vehicle 타입으로 선언되었습니다. Car 클래스는 Vehicle 클래스를 상속받은 자식 클래스이며, 따라서 Vehicle 클래스에 정의된 모든 프로퍼티와 메서드를 물려받았습니다. Vehicle 클래스 타입에 구현되어 있어야 하는 프로퍼티와 메서드가 상속을 통해 모두 구현되어 있으므로 Car 클래스는 형식상 Vehicle 타입으로 간주할 수 있습니다. 반대로 Vehicle 인스턴스를 Car 클래스 타입 변수나 상수에 할당할 수는 없습니다. Car 타입이 되기 위해 가져야 할 요소들 중에서 gear 프로퍼티나 wiper() 메서드가 Vehicle 클래스에는 정의되어 있지 않기 때문입니다.
let car: Car = Vehicle() // Error!
이처럼 상속 관계에 있는 상위 클래스 타입으로 선언해서 사용하는 이유는 무엇일까요? 함수나 메서드의 인자값을 정의할 때 하위 클래스 타입으로 선언하는 것보다 상위 클래스 타입으로 선언하면 인자값으로 사용할 수 있는 객체의 범위가 훨씬 넓어집니다.
func move(param: Car) {
param.accelerate()
}
여기서 accelerate()메서드는 Vehicle에서 정의된 것으로 만약 param이 Vehicle 타입을 받는다면 훨씬 넓은 범위의 인자값을 객체로 받을 수 있습니다. 아래처럼 바꿀 수 있습니다.
func move(param: Vehicle) {
param.accelerate()
}
Last updated