클래스는 메소드, 프로퍼티와 다른 특징을 다른 클래스로부터 상속받을 수 있다.
클래스에서는 저장된 프로퍼티와 계산된 프로퍼티와 상관 없이 상속 받은 프로퍼티에 프로퍼티 옵저버를 설정해서 값 설정에 반응할 수 있다.
다른 어떤 클래스로부터도 상속받지 않은 클래스를 기반 클래스라고 한다.
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 SomeSubclass: SomeSuperclass {
// subclass definition goes here
}
위 Vehicle
을 서브클래싱해보자.
class Bicycle: Vehicle {
var hasBasket = false
}
자기 자신의 속성 hasBasket
을 추가한다.
물론 부모로부터 물려받은 currentSpeed
, description
속성도 사용 가능하다.
서브클래스로 생성된 클래스를 다시 서브클래싱하는 것도 가능하다.
서브클래스에서는 부모클래스에서 상속받은 것을 재정의할 수 있다. 이를 overriding
이라고 한다.
오버라이딩은 인스턴스 메소드, 타입 메소드, 인스턴스 프로퍼티, 타입 프로퍼티, 서브스크립트 모두에 대해 가능하다.
선언 앞에 override
키워드를 붙여 오버라이드한다.
super
키워드와 점 문법 혹은 인덱스 구문으로 부모클래스의 메소드, 프로퍼티, 서브 스크립트에 접근할 수 있다.
super.someMethod
, super.someProperty
, super[someIndex]
메소드 선언 앞에 override
키워드를 붙이고 내용을 적어준다.
class Train: Vehicle {
override func makeNoise() {
print("Choo Choo")
}
}
서브클래스에서는 상속받은 저장된 프로퍼티, 계산된 프로퍼티 모두 오버라이드 가능하다.
오버라이드 할 때는 프로퍼티의 이름과 타입을 명시해야 한다.
상속받은 읽기전용(read only) 프로퍼티는 getter
, setter
를 정의해서 읽고/쓰기(read-write)가 가능한 프로퍼티로 변경해서 제공할 수 있다. (반대는 불가능)
만약
setter
를 오버라이드 해서 제공한다면 반드시getter
도 제공해야 한다.
이미 부모클래스에 선언된 프로퍼티 옵저버도 서브클래스에서 재정의해 사용할 수 있다.
상수 프로퍼티와 읽기전용 프로퍼티에는 옵저버를 붙일 수 없다. 이 프로퍼티는 정의 그대로
set
을 할 수 없는 프로퍼티이기 때문이다.
같은 프로퍼티에 옵저버를 추가하고setter
를 추가해 둘을 동시에 사용할 수 없다. 이미setter
를 설정했다면 옵저버를 붙인 것과 같은 동작을 하기 때문이다.
서브클래스에서 특정 메소드, 프로퍼티, 서브스크립트가 오버라이드 되는 것을 방지하려면 final
키워드를 사용한다.
클래스 전체를 final
로 선언해서 클래스 안의 모든 메소드, 프로퍼티 등이 override
되는 것을 막을 수 있다.
참고
https://jusung.gitbook.io/the-swift-language-guide/language-guide/13-inheritance