상속이란 한 클래스가 다른 클래스에서 정의된 프로퍼티나 메소드를 물려받아 사용하는 것
프로퍼티와 메소드를 물려준 클래스 = 부모 클래스 = 상위 클래스 = 슈퍼 클래스 = 기본 클래스
프로퍼티와 메소드를 물려받은 클래스 = 자식 클래스 = 하위 클래스 = 서브 클래스 = 파생 클래스
// 기본 클래스
class A {
var name = "Class A"
var description: String {
return "This class name : \(self.name)"
}
func foo() {
print("\(self.name)'s method is called")
}
}
let a = A()
a.name // "Class A"
a.description // "This class name : Class A"
a.foo() // "Class A's method is called"
// 서브 클래싱
class B: A {
var prop = "Class B"
func boo() -> String {
return "Class B prop = \(self.prop)"
}
}
let b = B()
b.prop // "Class B"
b.boo() // "Class B prop = Class B"
//b 는 A 클래스를 상속받음으로써 A의 프로퍼티와 메소드를 상속받음
b.name // "Class A"
b.foo() // "Class A's method is called"
자식 클래스에서 재정의된 메소드나 프로퍼티는 부모 클래스로부터 물려받은 내용을 덮어쓰게 되는데, 이 과정을 오버라이딩이라고 한다.
오버라이드 하기 위해서는 오버라이딩 하려는 메소드나 프로퍼티 앞에 override
키워드를 붙여야한다.
다음은 프로퍼티 오버라이딩 시 허용되지 않는 것들이다.
즉 computed -> computed 오버라이딩이 가능하고, 더 많은 기능을 확장
또는 변경
하는 방향으로 오버라이딩이 가능하지만 기능을 제한할 수는 없다.
class C: B {
override var prop: String {
get {
"Override시 stored -> computed 가능 ~!~!"
}
set {
"Set 가능 저장 -> 연산"
}
}
override func boo() -> String {
return "This function is overriding B's Boo()"
}
func boo(input: String) -> String {
let overloading: String = "\(input)이 있어서 얘는 다른 method로 취급됨 ^^"
return overloading
}
}
let c = C()
c.boo() // "This function is overriding B's Boo()"