Inheritance
- 클래스는 메서드, 프로퍼티와 다른 특징을 다른 클래스로부터 상속할 수 있습니다. 이것이 Swift에서 클래스가 다른 타입과 구분되는 근본적인 요소입니다. 클래스에서는 저장된 프로퍼티와 계산된 프로퍼티와 상관없이 상속받은 프로퍼티에 프로퍼티 옵서버를 설정해서 값 설정에 반응할 수 있습니다.
Defining a Base Class
- 다른 어떤 클래스로부터도 상속받지 않은 클래스를 기반 클래스라 합니다.
- Objective-C에서는 모든 클래스가 NSObject클래스로부터 파생된 클래스로 생성되는 것과 다르게 Swift 에서는 SuperClass 지정 없이 클래스 선언이 가능하고 그 클래스가 SuperClass 가 됩니다.
- 이에 대한 예시입니다.
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
}
}
- 위 코드는 Vehicle 이라는 기반 클래스를 하나 정의한 것입니다. currentSpeed를 프로퍼티로 갖고 있고 description을 계산된 프로퍼티로 선언했습니다. makeNoise()라는
- 이 클래스를 이용해 Vehicle 객체를 하나 생성합니다.
let someVehicle = Vehicle()
print("Vehicle: \(someVehicle.description)")
// Vehicle: traveling at 0.0 miles per hour
Subclassing
- 서브클래싱을 하면 부모로부터 성격을 상속받고 자기 자신 고유의 특성도 추가할 수 있습니다. 아래는 이에 대한 예시입니다.
class SomeSubclass: SomeSuperclass {
// subclass definition goes here
}
class Bicycle: Vehicle {
var hasBasket = false
}
let bicycle = Bicycle()
bicycle.hasBasket = true
bicycle.currentSpeed = 15.0
print("Bicycle: \(bicycle.description)")
// Bicycle: traveling at 15.0 miles per hour
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
Overriding
- 서브클래스에서는 부모클래스에서 상속받은 것을 재정의 할 수 있습니다. 이것을 overridingoverriding이라 부르는데, 오버 라이딩은 인스턴스 메서드, 타입 메서드, 인스턴스 프로퍼티, 타입 프로퍼티, 서브 스크립트 모두 가능합니다. 오버라이드를 위해서는 다른 선언 앞에 override키워드를 붙여줍니다. Swift에서는 이 override키워드를 보면 부모에 그 정의가 있는지 확인합니다.
Accessing Superclass Methods, Properties, and Subscripts
- super 키워드와 점문법 혹은 인덱스 구문으로 부모 클래스의 메서드, 프로퍼티, 서브 스크립트에 접근할 수 있습니다. ex) super.someMethod, super.someProperty, super[someIndex]
Overriding Methods
- 상속받은 메서드를 오버라이드 하기 위해서는 메소드 선언 앞에 override 키워드를 적어주면 됩니다.
class Train: Vehicle {
override func makeNoise() {
print("Choo Choo")
}
}
let train = Train()
train.makeNoise()
// Prints "Choo Choo"
Overriding Properties
- 서브클래스에서는 상속받은 저장된 프로퍼티, 계산된 프로퍼티 모두 오버라이드 가능합니다.
- 오버라이드시에는 프로퍼티의 이름과 타입을 명시해야 합니다. 왜냐하면 서브클래스에서는 단순히 상속받은 특정 형의 프로퍼티가 있다는 정도만 알고 있기 때문입니다.
- 상속받은 read only 프로퍼티도 getter/setter를 정의해서 read-write 프로퍼티로 변경해서 제공 가능합니다. 하지만 반대로 read-write 프로퍼티를 read-only로 변경하는 것을 불가능합니다.
class Car: Vehicle {
var gear = 1
override var description: String {
return super.description + " in gear \(gear)"
}
}
let car = Car()
car.currentSpeed = 25.0
car.gear = 3
print("Car: \(car.description)")
// Car: traveling at 25.0 miles per hour in gear 3
Overriding Property Observers
- 이미 부모 클래스에 선언된 프로퍼티 옵서버도 서브클래스에서 재정의하여 사용할 수 있습니다.
- 상수 프로퍼티와 읽기 전용 프로퍼티에는 옵서버를 사용할 수 없습니다. 이 프로퍼티는 정의 그대로 set을 할 수 없는 프로퍼티이기 때문입니다, 그리고 같은 프로퍼티에 옵저버를 추가하고 setter를 추가해 둘을 동시에 사용할 수 없습니다. 왜냐하면, 이미 setter를 설정했다면 옵저버를 붙인 것과 같은 동작을 하기 때문입니다.
class AutomaticCar: Car {
override var currentSpeed: Double {
didSet {
gear = Int(currentSpeed / 10.0) + 1
}
}
}
let automatic = AutomaticCar()
automatic.currentSpeed = 35.0
print("AutomaticCar: \(automatic.description)")
// AutomaticCar: traveling at 35.0 miles per hour in gear 4
Preventing Overrides
- 서브클래스에서 특정 메서드, 프로퍼티, 서브 스크립트가 오버라이드 되는 것을 방지하려면 final 키워드를 사용합니다.
- final로 선언되면 overrideoverride 되는 것을 막을 수 있습니다.
- [ final func, final class func, final subscript]처럼final로 선언된 메서드, 프로퍼티, 서브 스크립트를 오버라이드 하려고 하면 compile-time 에러가 발생합니다.
- 클래스 전체를 final final로 선언해서 클래스 안의 모든 메서드, 프로퍼티 등이 override 가 되는 것을 막을 수 있습니다. (final class)
내용은 https://docs.swift.org/swift-book/LanguageGuide/TheBasics.html를 보면서 작성하였고 원문으로 작성된 내용을 옮기다 보니 이상한 부분이 있을 수 있습니다. 자세한 내용은 위의 링크를 확인해주시기 바랍니다.
'컴퓨터 언어 > Swift' 카테고리의 다른 글
(Swift) 14. Deinitialization (초기화 해지) (0) | 2021.12.15 |
---|---|
(Swift) 13. Initialization (초기화) (0) | 2021.12.14 |
(Swift) 11. Subscripts (서브스크립트) (0) | 2021.12.13 |
(Swift) 10. Methods (메소드) (0) | 2021.12.11 |
(Swift) 9. Properties (특성) (0) | 2021.12.11 |