상속(Inheritance)

린다·2022년 2월 25일
0

The Swift Language Guide

목록 보기
7/7
post-thumbnail

아래의 글은 The swift programming languagebbiguduk님, jusung님의 번역본을 보며 공부한 내용입니다.

요약

클래스의 가장 큰 특징 중 하나

메소드, 프로퍼티 등 특징을 다른 클래스로부터 상속받을 수 있음

상속받은 프로퍼티에 프로퍼티 옵저버를 설정해서 값 설정에 반응할 수 있음

기반 클래스 정의(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 Bicycle: Vehicle {
    var hasBasket = false
}
  • 서브 클래싱된 클래스도 다시 한 번 서브 클래싱 가능함
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)

  • 부모로부터 상속한 것을 재정의하여 사용하는 것이 바로 오버라이딩
  • 인스턴스 메소드, 타입 메소드, 인스턴스 프로퍼티, 타입 프로퍼티, 서브 스크립트 모두 가능
  • 키워드 override : 이 키워드가 등장하면 Swift에서는 부모 클래스에 해당 정의가 있는지 확인함

부모클래스의 메소드, 프로퍼티, 서브스크립트의 접근 (Accessing Superclass Methods, Properties, and Subscripts)

  • 키워드 super를 사용하여 부모 클래스 속성에 접근할 수 있음

메소드 오버라이드 (Overriding Methods)

  • 상속받은 메소드 재정의
class Train: Vehicle {
    override func makeNoise() {
        print("Choo Choo")
    }
}

프로퍼티 오버라이드 (Overriding Properties)

  • Stored property, computed property 모두 오버라이드 가능
  • 오버라이드 할 때 프로퍼티의 이름, 타입을 명시해야함
  • computed property의 경우 읽기 전용 → 읽기/쓰기 변경 가능 하지만 읽기/쓰기 → 읽기 전용으로 변경은 불가능
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)

  • 부모 클래스에서 선언된 프로퍼티 옵저버도 subclass에서 재정의 가능
  • let property, read-only property에는 옵저버 붙일 수 없음 (값이 set될 수 없기 때문에)
  • setter와 프로퍼티 옵저버를 동시에 사용하는 것도 불가능 (setter가 이미 옵저버를 붙인 것과 같이 동작하기 때문에)
class AutomaticCar: Car {
    override var currentSpeed: Double {
        didSet {
            gear = Int(currentSpeed / 10.0) + 1
        }
    }
}

오버라이드 방지 (Preventing Overrides)

  • 메서드, 프로퍼티, 서브스크립트가 재정의되는 것을 방지하기 위해 사용하는 키워드 fianl
    • fianl func, final class func, final subscript
    • final class: 클래스 전체를 final로 선언해서 클래스 안의 모든 속성에 final 특성을 적용시킬 수 있음
  • final 키워드가 있으면 상속되거나 재정의될 수 없음
  • 만약 final 키워드가 있는데 상속 or 재정의 시도하면 컴파일 에러 발생

0개의 댓글