2. Basic concept of Inheritance
• Subclass : 상속 받는 클래스
• Superclass : subclass가 상속하는 클래스
• 모든 클래스는 상위 클래스에 속한 메서드, 프로퍼티, 서브스크립트들을 호출하고
접근할 수 있고, 해당 메서드, 프로퍼티, 서브스크립트들을 오버라이딩하여
재정의할 수 있다.
3. Define as a Base Class
어떠한 클래스도 상속받지 않은 클래스, 즉, 상위클래스를 갖지 않는 클래스
4. Define as a Base Class
class Vehicle {
var numberOfWheels : Int
var maxPassengers : Int
func description() -> String {
return “(numberOfWheels) wheels; up to (maxPassengers) passengers”
}
init() {
numberOfWheels = 0
maxPassengers = 1
}
}
let vehicle = Vehicle()
베이스클래스 정의 부분
Vehicle의 새로운 인스턴스 생성
5. Subclassing
• 하위클래스를 정의한다 => 기존 클래스를 기반으로 새로운 클래스를 생성하는 것
• 기존 클래스의 모든 특징을 상속받고, 재정의할 수 있다.
Basic structure Of subclass
class SomeClass : SomeSuperClass {
//class definition goes here
}
6. Subclassing
class Bicycle : Vehicle {
init() {
super.init()
numberOfWheels = 2
}
}
let bicycle = Bicycle()
println(“Bicycle : (bicycle.description())”)
//Bicycle : 2 wheels; up to 1 passengers
7. class Tandem : Bicycle {
init() {
super.init()
maxPassengers = 2
}
}
Subclassing
let tandem = Tandem()
println( Tandem : (tandem.description());)
//Tandem : 2 wheels; up to 2 passengers
8. Overriding
• 하위클래스에서 인스턴스 메서드, 클래스 메서드, 인스턴스 프로퍼티,
서브스크립트에 대해 자신만의 커스텀 구현체를 제공하는 것
• 즉, 기능의 재정의
• 상속한 특징을 override하기 위해서는 반드시 앞에 override 키워드를 붙인다.
• Override 키워드가 없는 override는 컴파일 에러!
9. Accessing superclass, methods, properties and subscripts
• super 접두사를 통해 상위클래스의 메서드, 프로퍼티, 서브스크립트에 접근 가능
• someMethod()가 override 됐을 경우 super.someMethod()를 통해 접근
• someProperty가 override 됐을 경우 super.someProperty를 통해 접근
• someIndex가 override 됐을 경우 super[someIndex]를 통해 접근
10. Overriding Methods
class Car : Vehicle {
var speed: Double = 0.0
init() {
super.init()
maxPassengers = 5
numberOfWheels = 4
}
override func description() -> String {
return super.description() + “;” + “traveling at (speed) mph”
}
}
let car = Car()
println(“Car : (car.description())”);
//Car : 4 wheels; up to 5 passengers; traveling at 0.0 mph
11. Overriding Properties
• 상속한 프로퍼티를 오버라이드하려면 그 프로퍼티가 stored 혹은 computed
프로퍼티인지 관계없이 커스텀 접근자와 설정자를 제공
• 하위클래스는 오로지 상속한 프로퍼티의 이름과 타입만 알게 됨
• 항상 오버라이딩하려는 프로퍼티의 이름과 타입을 동일하게 설정
• 읽기만 가능했던 프로퍼티를 읽기, 쓰기 둘다 가능하게 오버라이딩 가능
• 하지만, 읽고 쓰기가 가능했던 프로퍼티를 읽기만 가능한 프로퍼티로 오버로딩하는 것은
불가능
12. Overriding Properties
class SpeedLimitedCar : Car {
override var speed : Double {
get {
return super.speed
}
set {
super.speed = min(newValue, 40.0)
}
}
}
let limitedCar = SpeedLimitedCar()
limitedCar.speed = 60.0
println(“SpeedLimitedCar : (limitedCar.description())”)
//SpeedLimitedCar : 4 wheels; up to 5 passengers; traveling at 40.0 mph
13. Overriding Property Observers
• 프로퍼티 관찰자는 상수 혹은 읽기 전용 프로퍼티에 추가될 수 없음
• 프로퍼티 값은 다시 설정될 수 없으므로 willSet() 혹은 didSet()을 제공하는 게
적절하지 않음
• 오버라이딩 설정자와 오버라이딩 프로퍼티 관찰자를 동시에 제공 불가능
15. Preventing Overrides
• Override를 방지하려면 @final을 첫 키워드에 표시
• 하위클래스 내에 final 메서드, 프로퍼티, 서브스크립트를 오버라이드하면
컴파일 에러 발생
• 전체 클래스를 final로 만들려면 class 앞에 @final 표시, 하위 클래스를 final
클래스로 만들려면 컴파일 에러 발생