소소한개발팁
article thumbnail
반응형

Inheritance

- 클래스는 메서드, 프로퍼티와 다른 특징을 다른 클래스로부터 상속할 수 있습니다. 이것이 Swift에서 클래스가 다른 타입과 구분되는 근본적인 요소입니다. 클래스에서는 저장된 프로퍼티와 계산된 프로퍼티와 상관없이 상속받은 프로퍼티에 프로퍼티 옵서버를 설정해서 값 설정에 반응할 수 있습니다.

 

 

 Defining a Base Class 

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

 

- Objective-C에서는 모든 클래스가 NSObject클래스로부터 파생된 클래스로 생성되는 것과 다르게 Swift 에서는 SuperClass 지정 없이 클래스 선언이 가능하고 그 클래스가 SuperClass 가 됩니다.

 

- 이에 대한 예시입니다.

 

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

 

- 위 코드는 Vehicle 이라는 기반 클래스를 하나 정의한 것입니다. currentSpeed를 프로퍼티로 갖고 있고 description을 계산된 프로퍼티로 선언했습니다. makeNoise()라는

 

- 이 클래스를 이용해 Vehicle 객체를 하나 생성합니다. 

 

let someVehicle = Vehicle() 

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

 

 

Subclassing 

- 서브클래싱을 하면 부모로부터 성격을 상속받고 자기 자신 고유의 특성도 추가할 수 있습니다. 아래는 이에 대한 예시입니다.

 

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

class Bicycle: Vehicle {
    var hasBasket = false
}

let bicycle = Bicycle()

bicycle.hasBasket = true
bicycle.currentSpeed = 15.0

print("Bicycle: \(bicycle.description)")
// Bicycle: traveling at 15.0 miles per hour

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 

- 서브클래스에서는 부모클래스에서 상속받은 것을 재정의 할 수 있습니다. 이것을 overridingoverriding이라 부르는데, 오버 라이딩은 인스턴스 메서드, 타입 메서드, 인스턴스 프로퍼티, 타입 프로퍼티, 서브 스크립트 모두 가능합니다. 오버라이드를 위해서는 다른 선언 앞에 override키워드를 붙여줍니다. Swift에서는 이 override키워드를 보면 부모에 그 정의가 있는지 확인합니다.

 

 

Accessing Superclass Methods, Properties, and Subscripts 

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

 

 

Overriding Methods 

- 상속받은 메서드를 오버라이드 하기 위해서는 메소드 선언 앞에 override 키워드를 적어주면 됩니다.

 

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

let train = Train()
train.makeNoise()
// Prints "Choo Choo"

 

 

Overriding Properties 

- 서브클래스에서는 상속받은 저장된 프로퍼티, 계산된 프로퍼티 모두 오버라이드 가능합니다.

 

- 오버라이드시에는 프로퍼티의 이름과 타입을 명시해야 합니다. 왜냐하면 서브클래스에서는 단순히 상속받은 특정 형의 프로퍼티가 있다는 정도만 알고 있기 때문입니다.

 

- 상속받은 read only 프로퍼티도 getter/setter를 정의해서 read-write 프로퍼티로 변경해서 제공 가능합니다. 하지만 반대로 read-write 프로퍼티를 read-only로 변경하는 것을 불가능합니다.

 

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 

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

 

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

 

class AutomaticCar: Car {
    override var currentSpeed: Double {
        didSet {
            gear = Int(currentSpeed / 10.0) + 1
        }
    }
}

let automatic = AutomaticCar()

automatic.currentSpeed = 35.0

print("AutomaticCar: \(automatic.description)")
// AutomaticCar: traveling at 35.0 miles per hour in gear 4

 

 

Preventing Overrides

- 서브클래스에서 특정 메서드, 프로퍼티, 서브 스크립트가 오버라이드 되는 것을 방지하려면 final 키워드를 사용합니다.

 

- final로 선언되면 overrideoverride 되는 것을 막을 수 있습니다.

 

- [ final func, final class func, final subscript]처럼final로 선언된 메서드, 프로퍼티, 서브 스크립트를 오버라이드 하려고 하면 compile-time 에러가 발생합니다.

 

- 클래스 전체를 final final로 선언해서 클래스 안의 모든 메서드, 프로퍼티 등이 override 가 되는 것을 막을 수 있습니다. (final class)

 

 

내용은 https://docs.swift.org/swift-book/LanguageGuide/TheBasics.html를 보면서 작성하였고 원문으로 작성된 내용을 옮기다 보니 이상한 부분이 있을 수 있습니다. 자세한 내용은 위의 링크를 확인해주시기 바랍니다.

반응형
profile

소소한개발팁

@개발자 뱅

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!