Swift - 13. 상속 Inheritance

지우개·2022년 3월 29일
0

Swift study

목록 보기
2/15
post-thumbnail

클래스는 메소드, 프로퍼티와 다른 특징을 다른 클래스로부터 상속받을 수 있다.
클래스에서는 저장된 프로퍼티와 계산된 프로퍼티와 상관 없이 상속 받은 프로퍼티에 프로퍼티 옵저버를 설정해서 값 설정에 반응할 수 있다.


기반 클래스 정의 Defining a Base Class

다른 어떤 클래스로부터도 상속받지 않은 클래스를 기반 클래스라고 한다.

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
    }
}

서브클래싱 Subclassing

상속, 즉 서브클래싱을 하면 부모로부터 성격을 상속받고 자기 자신 고유의 특성도 추가할 수 있다.

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

Vehicle을 서브클래싱해보자.

class Bicycle: Vehicle {
    var hasBasket = false
}

자기 자신의 속성 hasBasket을 추가한다.
물론 부모로부터 물려받은 currentSpeed, description 속성도 사용 가능하다.

서브클래스로 생성된 클래스를 다시 서브클래싱하는 것도 가능하다.


오버라이딩 Overriding

서브클래스에서는 부모클래스에서 상속받은 것을 재정의할 수 있다. 이를 overriding이라고 한다.
오버라이딩은 인스턴스 메소드, 타입 메소드, 인스턴스 프로퍼티, 타입 프로퍼티, 서브스크립트 모두에 대해 가능하다.
선언 앞에 override 키워드를 붙여 오버라이드한다.


부모 클래스의 메소드, 프로퍼티, 서브 스크립트의 접근

super 키워드와 점 문법 혹은 인덱스 구문으로 부모클래스의 메소드, 프로퍼티, 서브 스크립트에 접근할 수 있다.
super.someMethod, super.someProperty, super[someIndex]

메소드 오버라이드 Overriding Methods

메소드 선언 앞에 override 키워드를 붙이고 내용을 적어준다.

class Train: Vehicle {
    override func makeNoise() {
        print("Choo Choo")
    }
}

프로퍼티 오버라이드 Overriding Properties

서브클래스에서는 상속받은 저장된 프로퍼티, 계산된 프로퍼티 모두 오버라이드 가능하다.
오버라이드 할 때는 프로퍼티의 이름과 타입을 명시해야 한다.
상속받은 읽기전용(read only) 프로퍼티는 getter, setter를 정의해서 읽고/쓰기(read-write)가 가능한 프로퍼티로 변경해서 제공할 수 있다. (반대는 불가능)

만약 setter를 오버라이드 해서 제공한다면 반드시 getter도 제공해야 한다.

프로퍼티 옵저버 오버라이드 Overriding Property Observers

이미 부모클래스에 선언된 프로퍼티 옵저버도 서브클래스에서 재정의해 사용할 수 있다.

상수 프로퍼티와 읽기전용 프로퍼티에는 옵저버를 붙일 수 없다. 이 프로퍼티는 정의 그대로 set
을 할 수 없는 프로퍼티이기 때문이다.
같은 프로퍼티에 옵저버를 추가하고 setter를 추가해 둘을 동시에 사용할 수 없다. 이미 setter를 설정했다면 옵저버를 붙인 것과 같은 동작을 하기 때문이다.


오버라이드 방지 Preventing Overrides

서브클래스에서 특정 메소드, 프로퍼티, 서브스크립트가 오버라이드 되는 것을 방지하려면 final 키워드를 사용한다.
클래스 전체를 final로 선언해서 클래스 안의 모든 메소드, 프로퍼티 등이 override 되는 것을 막을 수 있다.


참고
https://jusung.gitbook.io/the-swift-language-guide/language-guide/13-inheritance

0개의 댓글