필수 생성자
- 필수 생성자 (Required Initializer) 는 클래스에서 반드시 구현해야 하는 생성자를 의미한다
- 하위 클래스에서도 이 생성자를 반드시 구현하도록 강제할 때 사용된다
- 클래스의 생성자 앞에
required 키워드를 붙여 선언한다
필수 생성자 정의 방법
required init() 또는 required init(parameters) 형태로 정의한다
- 하위 클래스에서 이 필수 생성자를 구현할 때는
required 키워드를 반드시 포함해야 한다
override 키워드는 필요하지 않다 (required 키워드가 이미 강제성을 부여하기 때문이다)
필수 생성자 정의와 구현
class Animal {
var name: String
required init(name: String) {
self.name = name
}
}
class Dog: Animal {
}
let myDog = Dog(name: "Buddy")
print("My dog's name is \(myDog.name)")
Animal 클래스는 name이라는 저장 속성을 가진다
required init(name:) 생성자는 필수 생성자로 선언되어 있다
Dog 클래스는 Animal 클래스를 상속하지만, 생성자를 구현하지 않아도 자동으로 상속된다
- 자동 상속이 발생한 이유는
Dog 클래스에서 다른 지정 생성자를 정의하지 않았기 때문이다
- 필수 생성자가 하위 클래스에서도 자동으로 상속된다
필수 생성자를 재정의하는 경우
class Vehicle {
var brand: String
required init(brand: String) {
self.brand = brand
}
}
class Car: Vehicle {
var model: String
init(brand: String, model: String) {
self.model = model
super.init(brand: brand)
}
required init(brand: String) {
self.model = "Unknown Model"
super.init(brand: brand)
}
}
let myCar = Car(brand: "Toyota")
print("My car is a \(myCar.brand) \(myCar.model)")
Vehicle 클래스는 brand라는 저장 속성을 가진다
required init(brand:) 생성자는 필수 생성자로 선언되었다
Car 클래스는 Vehicle 클래스를 상속하며, model이라는 추가 저장 속성을 가진다
Car 클래스에서 새로운 지정 생성자 init(brand:model:)을 정의했기 때문에 자동 상속 규칙이 깨진다
- 따라서
required init(brand:)를 하위 클래스에서 반드시 구현해야 한다
- 필수 생성자 재정의 시에는
override 키워드를 사용하지 않고 required 키워드만 사용한다
UIView의 필수 생성자 사용 예제
import UIKit
class CustomView: UIView {
required init?(coder: NSCoder) {
super.init(coder: coder)
}
override init(frame: CGRect) {
super.init(frame: frame)
}
}
class RoundedView: CustomView {
var cornerRadius: CGFloat
init(frame: CGRect, cornerRadius: CGFloat) {
self.cornerRadius = cornerRadius
super.init(frame: frame)
self.layer.cornerRadius = cornerRadius
}
required init?(coder: NSCoder) {
self.cornerRadius = 0
super.init(coder: coder)
}
}
UIView 클래스는 required init?(coder:)라는 필수 생성자를 가지고 있다
CustomView 클래스는 이 필수 생성자를 구현해야 하며, 그렇지 않으면 컴파일 오류가 발생한다
RoundedView 클래스는 cornerRadius라는 새로운 저장 속성을 추가한다
RoundedView 클래스에서 init(frame:cornerRadius:)라는 새로운 지정 생성자를 정의했다
- 자동 상속 규칙이 깨졌으므로,
required init?(coder:)를 반드시 구현해야 한다
required init?(coder:)는 Interface Builder와 관련된 필수 생성자로, 필수적으로 구현해야 한다
- 만약
Interface Builder 사용을 지원하지 않으려면 fatalError()로 구현할 수도 있다
필수 생성자의 자동 상속 조건
자동 상속이 발생하는 경우
- 하위 클래스에서 다른 지정 생성자를 정의하지 않은 경우 (상위 클래스의 필수 생성자가 자동 상속됨)
자동 상속이 발생하지 않는 경우
- 하위 클래스에서 새로운 지정 생성자를 정의한 경우
- 이 경우, 하위 클래스에서 필수 생성자를 반드시 구현해야 한다 (
required init())
요약
- 필수 생성자 (required)는 상속된 클래스에서 반드시 구현되어야 한다
- 필수 생성자가 자동으로 상속되는 경우
- 하위 클래스에서 다른 지정 생성자를 정의하지 않은 경우
- 필수 생성자가 자동으로 상속되지 않는 경우
- 하위 클래스에서 새로운 지정 생성자를 정의한 경우
- UIView의 필수 생성자
required init?(coder:)는 Interface Builder 사용 시 반드시 구현해야 한다