[Swift] Inheritance

Lena·2020년 12월 15일
0
post-custom-banner

Inheritance

A class can inherit methods, properties, and other characteristics from another class. When one class inherits from another, the inheriting class is known as a subclass, and the class it inherits from is known as its superclass. Inheritance is a fundamental behavior that differentiates classes from other types in Swift.

class는 methods, properties 등을 상속할 수 있습니다. class의 상속은 기본적으로 다른 타입과는 다른 특징입니다.

class는 superclass의 methods, properties, and subscripts를 호출할 수 있고, override(재정의) 할 수 있습니다.

superclass가 stored or computed property로 정의했더라도 subclass가 property observers를 추가할 수 있습니다(overriding).

Subclassing

class SomeSubclass: SomeSuperclass {
    // subclass definition goes here
}

Overriding

A subclass can provide its own custom implementation of an instance method, type method, instance property, type property, or subscript that it would otherwise inherit from a superclass. This is known as overriding.

subclass는 superclass로부터 상속받은 instance method, type method, instance property, type property, or subscript을 custom 구현할 수 있습니다. 이를 overriding 이라고 합니다.

The override keyword also prompts the Swift compiler to check that your overriding class’s superclass (or one of its parents) has a declaration that matches the one you provided for the override. This check ensures that your overriding definition is correct.

override 키워드를 사용해서 superclass와 중복된 정의가 아님을 명시합니다. 또한, override 키워드는 compiler로 하여금 override된 값이 superclass에도 선언되어 있는지 체크하게 해서 overriding한 정의가 올바른지 확인합니다.

Accessing Superclass Methods, Properties, and Subscripts

you access the superclass version of a method, property, or subscript by using the super prefix:

super 키워드로 superclass의 method, property, or subscript에 접근할 수 있습니다.

Overriding Methods

class Train: Vehicle {
    override func makeNoise() {
        print("Choo Choo")
    }
}
let train = Train()
train.makeNoise()
// Prints "Choo Choo"

Overriding Properties

You can override an inherited instance or type property to provide your own custom getter and setter for that property, or to add property observers to enable the overriding property to observe when the underlying property value changes.

상속받은 instance or type property를 override해서 custom gettersetter를 제공할 수 있습니다. 또, property observers를 추가하는 것도 가능합니다.

Overriding Property Getters and Setters

subclass는 상속받은 프로퍼티의 name과 type만 알기 때문에 superclass에서 stored or computed property 중 어떤 것으로 구현되었든 name과 type만 일치시켜서 override 할 수 있습니다.

상속받은 read-only property를 read-write property로 override 할 수 있습니다. 하지만 read-write property를 read-only property로 override 할 수는 없습니다.

Overriding Property Observers

property observer를 추가해서 overriding 할 수도 있습니다.
상속받은 property의 값이 변경되는 것을 감지해서 didSet willSet 을 작성할 수 있습니다.

property observer를 상수나 read-only computed property에 추가할 수 는 없습니다. 왜냐하면 이러한 프로퍼티들은 set될 수 없기 때문에 didSet or willSet을 작성하는 것은 적절하지 않습니다.

You cannot add property observers to inherited constant stored properties or inherited read-only computed properties. The value of these properties cannot be set, and so it is not appropriate to provide a willSet or didSet implementation as part of an override.

또한, 동일한 property에 setter와 property observer를 동시에 override 할 수 없습니다.

Note also that you cannot provide both an overriding setter and an overriding property observer for the same property. If you want to observe changes to a property’s value, and you are already providing a custom setter for that property, you can simply observe any value changes from within the custom setter.

Preventing Overrides

method, property, or subscript 앞에 final을 명시해서 override 되는 것을 막을 수 있습니다.

Notes

  • final: override 방지
  • static: static type method override 불가능
  • class: type method 앞에 class를 붙이면 override 가능
class Person {
    var name: String = ""
    func selfIntroduce() { print("저는 \(name)입니다") }
    
    // final - 재정의 불가
    final func sayHello() {
        print("hello")
    }
    
    // static - 재정의 불가
    static func typeMethod() {
        print("type method - static")
    }

    // class - 재정의 가능
    class func classMethod() {
        print("type method - class")
    }

    // 재정의 가능한 class method라도 final 키워드를 사용하면 재정의 할 수 없음
    final class func finalClassMethod() {
        print("type method - final class")
    }
}

// Person을 상속받는 Student
class Student: Person {
    var major: String = ""
    override func selfIntroduce() {
        print("저는 \(name)이고, 전공은 \(major)입니다")
    }

    override class func classMethod() {
        print("overriden type method - class")
    }
}

References

https://docs.swift.org/swift-book/LanguageGuide/Inheritance.html
https://www.edwith.org/boostcamp_ios/lecture/11309

post-custom-banner

0개의 댓글