iOS

Swift ;; 상속(Inheritance)

may_wonhui 2022. 4. 26. 15:26

클래스가 구조체와 다른 큰 특징 중의 하나는 상속이 가능하다는 것이었다.

 

상속은 말 그대로 부모가 자식에게 물려주는 것처럼, 

상위 클래스(superclass)가 하위 클래스(subclass)에 자신이 가진 프로퍼티, 메서드, 서브스크립트 등을 물려주는 것이다.

 


[형식]

class 서브클래스명: 슈퍼클래스명 {

          ...

}

 

 


[예시]

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

여기서, Vehicle은 상속을 받지 않은 기본 클래스이다. 이를 baseclass라고 한다.

 

class Bicycle: Vehicle {
	var hasBasket = false
}

let bicycle = Bicycle()
bicycle.hasBasket = true //Bicycle 클래스의 hasBasket 프로퍼티에 접근 가능
bicycle.currentSpeed = 15.0 //Bicycle의 superclass인 Vehicle의 프로퍼티에 접근 가능

Bicycle은 Vehicle의 상속을 받았다. 따라서 Bicycle은 subclass, Vehicle은 superclass이다.

현재  Bicycle의 프로퍼티는 hasBasket 하나밖에 보이지 않지만,

Vehicle이 가진 프로퍼티와 메서드를 상속받았으므로 currentSpeed, description, makeNoise()를 다 가지고 있다.

따라서, 본인의 프로퍼티는 물론 Vehicle의 프로퍼티에 접근해서 currentSpeed의 값을 변경할 수 있다.

 

class Tandem: Bicycle {
	var currentNumberOfPassengers = 0
}

let tandem = Tandem()
tandem.currentNumberOfPassengers = 2
tandem.hasBasket = true
tandem.currentSpeed = 22.0
print("\(tandem.description)")

상속을 받은 Bicycle 클래스는 또 다른 클래스의 superclass가 될 수 있다.

본인 클래스의 currentNumberOfPassengers 프로퍼티 뿐만 아니라

Bicycle과 그 superclass Vehicle의 프로퍼티 및 메서드에도 접근이 가능하다.

 

 


[재정의(Overriding)]

subclass는 superclass로부터 상속받은 프로퍼티 및 메서드를 재정의할 수 있다.

class Car: Vehicle {
	var gear = 1
    override var description: String {
    	return super.description + " in gear \(gear)"
    }
}

subclass Car가 superclass Vehicle의 description을 재정의(수정)하고 있다.

super. 으로 부모의 프로퍼티 및 메서드에 접근할 수 있다.

Vehicle의 description 메서드를 super.description 를 통해 접근할 수 있다.

 

 

superclass에서 final 키워드를 사용하면 subclass에서 오버라이딩하는 것을 방지할 수 있다.

ex) final var notOverriding  = "final keyword prevent to overriding"

 

>> subclass에서 override하려고 하면 오류!

 

 

https://docs.swift.org/swift-book/LanguageGuide/Inheritance.html