Swift ;; 상속(Inheritance)
클래스가 구조체와 다른 큰 특징 중의 하나는 상속이 가능하다는 것이었다.
상속은 말 그대로 부모가 자식에게 물려주는 것처럼,
상위 클래스(superclass)가 하위 클래스(subclass)에 자신이 가진 프로퍼티, 메서드, 서브스크립트 등을 물려주는 것이다.
[형식]
class 서브클래스명: 슈퍼클래스명 {
...
}
[예시]
class Vehicle {
var currentSpeed = 0.0
var description: String {
return "traveling at \(currentSpeed) miles per hour"
}
func makeNoise() {
}
}
여기서, Vehicle은 상속을 받지 않은 기본 클래스이다. 이를 baseclass라고 한다.
class Bicycle: Vehicle {
var hasBasket = false
}
let bicycle = Bicycle()
bicycle.hasBasket = true //Bicycle 클래스의 hasBasket 프로퍼티에 접근 가능
bicycle.currentSpeed = 15.0 //Bicycle의 superclass인 Vehicle의 프로퍼티에 접근 가능
Bicycle은 Vehicle의 상속을 받았다. 따라서 Bicycle은 subclass, Vehicle은 superclass이다.
현재 Bicycle의 프로퍼티는 hasBasket 하나밖에 보이지 않지만,
Vehicle이 가진 프로퍼티와 메서드를 상속받았으므로 currentSpeed, description, makeNoise()를 다 가지고 있다.
따라서, 본인의 프로퍼티는 물론 Vehicle의 프로퍼티에 접근해서 currentSpeed의 값을 변경할 수 있다.
class Tandem: Bicycle {
var currentNumberOfPassengers = 0
}
let tandem = Tandem()
tandem.currentNumberOfPassengers = 2
tandem.hasBasket = true
tandem.currentSpeed = 22.0
print("\(tandem.description)")
상속을 받은 Bicycle 클래스는 또 다른 클래스의 superclass가 될 수 있다.
본인 클래스의 currentNumberOfPassengers 프로퍼티 뿐만 아니라
Bicycle과 그 superclass Vehicle의 프로퍼티 및 메서드에도 접근이 가능하다.
[재정의(Overriding)]
subclass는 superclass로부터 상속받은 프로퍼티 및 메서드를 재정의할 수 있다.
class Car: Vehicle {
var gear = 1
override var description: String {
return super.description + " in gear \(gear)"
}
}
subclass Car가 superclass Vehicle의 description을 재정의(수정)하고 있다.
super. 으로 부모의 프로퍼티 및 메서드에 접근할 수 있다.
Vehicle의 description 메서드를 super.description 를 통해 접근할 수 있다.
superclass에서 final 키워드를 사용하면 subclass에서 오버라이딩하는 것을 방지할 수 있다.
ex) final var notOverriding = "final keyword prevent to overriding"
>> subclass에서 override하려고 하면 오류!
https://docs.swift.org/swift-book/LanguageGuide/Inheritance.html