클래스는 다른 타입들과 다르게, 다른 클래스로부터 메서드, 프로퍼티 등을 상속받을 수 있다.
다른 클래스로부터 상속받지 않은 클래스를 기반 클래스 (Base Class)라 한다.
NSObject
Objective-C에서는 모든 클래스가
NSObject
클래스로부터 파생되는 것과 달리, Swift는 Superclass를 지정하지 않고 클래스를 선언할 수 있다.
class Vehicle {
var currentSpeed = 0.0
var description: String {
return "traveling at \(currentSpeed) miles per hour"
}
func makeNoise() {
// do Nothing
}
}
let someVehicle = Vehicle()
print("Vehicle: \(someVehicle.description)")
// Vehicle: traveling at 0.0 miles per hour
상속(Subclassing)을 하면 Superclass로부터 가능한 것들을 상속받고,
고유의 특성을 추가할 수 있다.
private
와 같은 접근 제어자들이 붙으면 상속이 불가능하다.class Bicycle: Vehicle {
var hasBasket = false
}
let bicycle = Bicycle()
bicycle.hasBasket = true // Bicycle Only
bicycle.currentSpeed = 15.0 // from Superclass
print("Bicycle: \(bicycle.description)")
// Bicycle: traveling at 15.0 miles per hour
서브클래스를 상속받는 새로운 서브클래스를 생성할 수 있다.
class Tandem: Bicycle {
var currentNumberOfPassengers = 0
}
let tandem = Tandem()
tandem.hasBasket = true // from Bicycle
tandem.currentNumberOfPassengers = 2 // Tandem only
tandem.currentSpeed = 22.0 // from Vehicle
print("Tandem: \(tandem.description)")
// Tandem: traveling at 22.0 miles per hour
슈퍼클래스로부터 상속받은 것을 서브클래스에서 재정의하는 것
override
키워드로 오버라이드할 수 있다.override
키워드가 붙어있으면 부모에 그것의 정의가 있는지 확인한다.super
키워드로 슈퍼클래스에 접근할 수 있다.
super.someMethod()
super.someProperty
super[someIndex]
class Train: Vehicle {
override func makeNoise() {
print("Choo Choo")
}
}
저장 프로퍼티, 계산 프로퍼티 모두 오버라이드 가능
setter
를 오버라이드해서 제공할 때에는 getter
도 반드시 제공class Car: Vehicle {
var gear = 1
override var description: String {
return super.description + " in gear \(gear)"
}
}
프로퍼티 옵저버도 오버라이드 가능
set
을 할 수 없기 때문)setter
을 동시에 추가 불가능final
키워드로 특정 메서드, 프로퍼티, 서브스크립트가 오버라이드 되는 것을 막을 수 있다.
final func someMethod()
final var someProperty
final subscript
클래스 자체를 final
로 설정하여 클래스의 상속 자체를 불가능하게 만들 수 있다.
final class SomeClass
final
로 설정된 속성들을 상속하려고 하면
컴파일 타임에 에러가 발생한다.