
클래스는 메소드, 프로퍼티와 다른 특징을 다른 클래스로부터 상속받을 수 있다.
클래스에서는 저장된 프로퍼티와 계산된 프로퍼티와 상관 없이 상속 받은 프로퍼티에 프로퍼티 옵저버를 설정해서 값 설정에 반응할 수 있다.
다른 어떤 클래스로부터도 상속받지 않은 클래스를 기반 클래스라고 한다.
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