Swift 정리 - Inheritance

김세영·2022년 3월 13일
0

Swift Doc 정리

목록 보기
12/17
post-thumbnail

클래스는 다른 타입들과 다르게, 다른 클래스로부터 메서드, 프로퍼티 등을 상속받을 수 있다.

  • 저장 프로퍼티, 계산 프로퍼티의 종류에 관계 없이 상속받은 프로퍼티에 옵저버를 설정할 수 있다.

Base Class

다른 클래스로부터 상속받지 않은 클래스를 기반 클래스 (Base Class)라 한다.

NSObject

Objective-C에서는 모든 클래스가 NSObject 클래스로부터 파생되는 것과 달리, Swift는 Superclass를 지정하지 않고 클래스를 선언할 수 있다.

class Vehicle {
    var currentSpeed = 0.0
    var description: String {
        return "traveling at \(currentSpeed) miles per hour"
    }
    func makeNoise() {
        // do Nothing
    }
}

let someVehicle = Vehicle()
print("Vehicle: \(someVehicle.description)")
// Vehicle: traveling at 0.0 miles per hour

Subclassing

상속(Subclassing)을 하면 Superclass로부터 가능한 것들을 상속받고,
고유의 특성을 추가할 수 있다.

  • private와 같은 접근 제어자들이 붙으면 상속이 불가능하다.
class Bicycle: Vehicle {
    var hasBasket = false
}
let bicycle = Bicycle() 
bicycle.hasBasket = true // Bicycle Only
bicycle.currentSpeed = 15.0 // from Superclass
print("Bicycle: \(bicycle.description)")
// Bicycle: traveling at 15.0 miles per hour

서브클래스를 상속받는 새로운 서브클래스를 생성할 수 있다.

  • 이어져 있는 모든 슈퍼클래스들로부터 가능한 것들을 상속받는다.
class Tandem: Bicycle {
    var currentNumberOfPassengers = 0
}
let tandem = Tandem()
tandem.hasBasket = true // from Bicycle
tandem.currentNumberOfPassengers = 2 // Tandem only
tandem.currentSpeed = 22.0 // from Vehicle
print("Tandem: \(tandem.description)")
// Tandem: traveling at 22.0 miles per hour

Overriding

슈퍼클래스로부터 상속받은 것을 서브클래스에서 재정의하는 것

  • override 키워드로 오버라이드할 수 있다.
  • 인스턴스 메서드, 타입 메서드, 인스턴스 프로퍼티, 타입 프로퍼티, 서브스크립트 모두 가능하다.
  • override 키워드가 붙어있으면 부모에 그것의 정의가 있는지 확인한다.

Accessing Superclass Methods, Properties, and Subscripts

super 키워드로 슈퍼클래스에 접근할 수 있다.

  • 메서드 super.someMethod()
  • 프로퍼티 super.someProperty
  • 서브스크립트 super[someIndex]

Overriding Methods

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

Overriding Properties

저장 프로퍼티, 계산 프로퍼티 모두 오버라이드 가능

  • 재정의 시 이름과 타입을 명시
  • read-only 프로퍼티는 재정의 시 read-write 프로퍼티로 변경 가능
  • read-write 프로퍼티는 재정의 시 read-only 프로퍼티로 변경 불가능
  • setter를 오버라이드해서 제공할 때에는 getter도 반드시 제공
class Car: Vehicle {
    var gear = 1
    override var description: String {
        return super.description + " in gear \(gear)"
    }
}

Overriding Property Observers

프로퍼티 옵저버도 오버라이드 가능

  • 상수로 선언된 프로퍼티, 읽기 전용 프로퍼티는 옵저버 오버라이드 불가능
    (set을 할 수 없기 때문)
  • 옵저버와 setter을 동시에 추가 불가능

Preventing Overrides

final 키워드로 특정 메서드, 프로퍼티, 서브스크립트가 오버라이드 되는 것을 막을 수 있다.

  • final func someMethod()
  • final var someProperty
  • final subscript

클래스 자체를 final로 설정하여 클래스의 상속 자체를 불가능하게 만들 수 있다.

  • final class SomeClass

final로 설정된 속성들을 상속하려고 하면
컴파일 타임에 에러가 발생한다.

profile
초보 iOS 개발자입니다ㅏ

0개의 댓글