8.6.2 초기화 구문의 오버라이딩
클래스에서 초기화 구문도 일종의 메서드이므로, 자식 클래스에서 오버라이딩 가능합니다. 예시를 보겠습니다.
class Base {
}
class ExBase: Base {
override init() {
}
}
Base 클래스에 초기화 구문이 선언되지 않았다면 기본 초기화 구문을 갖고 있으므로 자식 클래스 ExBase에서 부모의 기본 초기화 구문을 override 할 수 있습니다. 초기화 구문을 오버라이딩하면 더 이상 부모 클래스에서 정의한 초기화 구문이 실행되지 않습니다. 만약 부모 클래스의 기본 초기화 구문에서 프로퍼티를 초기화했다면, 자식 클래스에서 기본 초기화 구문을 오버라이딩함으로써 부모 클래스 프로퍼티의 초기화가 누락됩니다. 부모 클래스에서 정의된 초기화 구문을 내부적으로 호출하려면 super.init 구문을 작성하면 됩니다.
class Base {
var baseValue: Double
init(inputValue: Double) {
self.baseValue = inputValue
}
}
class ExBase: Base {
override init(inputValue: Double) {
super.init(inputValue: 10.5)
}
}
baseValue 프로퍼티는 옵셔널 타입이 아닌 일반 타입이므로 반드시 초기값이 있어야 하지만 초기화 구문의 오버라이딩으로 인해 초기값 할당 구문이 누락되면 오류가 발생합니다. 이러한 오류를 방지하기 위해 오버라이딩된 초기화 구문에서 부모 클래스의 초기화 구문을 직접 호출해 주게 됩니다. 그러면 초기화 구문의 호출 순서는 어떻게 될까요? 자식 초기화 구문 호출 -> 부모 초기화 구문 호출 순으로 이루어집니다. 만약 A, B, C 클래스가 있을 때, B가 A를 상속하고, C가 B를 상속하고, 초기화 구문에서 각각 부모의 초기화 구문을 호출한다면, 'C 초기화 구문 호출 -> B 초기화 구문 호출 -> A 초기화 구문 호출' 순으로 이루어집니다.
Last updated