상속 (Inheritance)
클래스는 메소드, 프로퍼티와 다른 특징들을 다른 클래스로부터 상속할 수 있습니다.
기반 클래스 정의 (Defining a Base Class)
어떤 클래스도 상속받지 않은 클래스를 기반 클래스라고 합니다.
서브 클래싱 (Subclassing)
서브 클래싱을 하면 부모로부터 메소드와 프로퍼티 등을 상속받고, 자기 자신의 고유한 특성도 추가할 수 있습니다.
class SomeChildClass: SomeParentClass{
}
class Vehicle {
var currentSpeed = 0.0
var description: String {
return "traveling at \(currentSpeed) miles per hour"
}
func makeNoise() {
// do nothing - an arbitrary vehicle doesn't necessarily make a noise
}
}
class Bicycle: Vehicle{
var hasBasket = false
}
let bicycle = Bicycle()
bicycle.currentSpeed = 15.0
-> 상속은 위와 같은 방법으로 합니다.
-> Bicycle은 Vehicle을 상속받고 자기 자신의 속성 hasBasket을 추가했습니다.
-> Bicycle 인스턴스인 bicycle은 부모로부터 물려받은 currentSpeed 속성 또한 사용이 가능합니다.
class Tandem: Bicycle {
var currentNumberOfPassengers = 0
}
let tandem = Tandem()
tandem.hasBasket = true
tandem.currentNumberOfPassengers = 2
tandem.currentSpeed = 22.0
print("Tandem: \(tandem.description)")
// Tandem: traveling at 22.0 miles per hour
-> Tandem은 Bicycle을 상속받습니다. 이때 tandem 인스턴스는 부모 속성뿐만 아니라 조부모 속성까지 사용할 수 있습니다.
오버 라이딩 (Overriding)
자식 클래스에서는 부모 클래스에서 상속받은 것을 재정의 할 수 있습니다. 이것을 overriding이라고 부릅니다.
오버 라이딩은 인스턴스 메소드, 타입 메소드, 인스턴스 프로퍼티, 타입 프로퍼티, 서브 스크립트 모두에 대해 가능합니다.
Swift에서는 override키워드가 있으면 부모 클래스에 해당 정의가 있는지 확인합니다.
부모 클래스의 메소드, 프로퍼티, 서브 스크립트의 접근 (Accessing Superclass Methods, Properties, and Subscripts)
super 키워드와 점문법, 인덱스 구문으로 부모 클래스의 속성들에 접근할 수 있습니다.
메소드 오버라이드 (Overriding Methods)
상속받은 메소드를 오버라이드 하기 위해서는 override 키워드를 붙입니다.
class Train: Vehicle{
override func makeNoise(){
print("Choo Choo")
}
}
let train = Train()
train.makeNoise()
// "Choo Choo"
프로퍼티 오버라이드 (Overriding Properties)
서브 클래스에서는 상속받은 프로퍼티를 오버 라이딩하는 것이 가능합니다. 오버라이드 시에는 프로퍼티의 이름과 타입을 명시해야 합니다. 상속받은 읽기 전용 (read only) 프로퍼티도 getter/setter를 정의해서 읽고/쓰기가 가능한 프로퍼티로 변경해서 제공 가능합니다.
하지만 반대는 불가능합니다.
class Car: Vehicle{
var gear = 1
override var description: String{
return super.description + " in gear \(gear)"
}
}
-> 계산된 프로퍼티를 오버라이딩한 예입니다.
프로퍼티 옵저버 오버라이드 (Overriding Property Observers)
이미 부모클래스에 선언된 프로퍼티 옵저버도 서브클래스에서 재정의해서 사용할 수 있습니다.
class AutomaticCar: Car{
override var currentSpeed: Double{
didSet{
gear = Int(currentSpeed / 10.0) + 1
}
}
}
-> 부모의 currentSpeed를 오버라이드하여 옵저버를 추가했습니다.
오버라이드 방지 (Preventing Overrides)
서브클래스에서 특정 메소드, 프로퍼티, 서브 스크립트가 오버라이드 되는 것을 방지하려면 final 키워드를 사용합니다. 다시 말해, final로 선언이 되면 override 되는 것을 막을 수 있습니다. 만약 final로 선언된 속성들을 오버라이드 하려고 하면 컴파일 시간에 에러가 발생합니다.