728x90
안녕하세요:)
오늘은 클래스에서 구현하는 특별한 생성자에 대해서 알아보도록 하겠습니다 +..+
1. Class Initializer
- Designated Initializer(지정 생성자)와 Convenience Initializer(간편 생성자)로 구분됩니다.
- Designated Initializer는 메인 생성자입니다. 메인 생성자는 클래스가 가진 모든 속성을 초기화해야 합니다.
- Designated Initializer의 수에는 제한이 없습니다.
- Convenience Initializer는 다양한 초기화 방법을 구현하기 위한 유틸리티 성격의 생성자입니다.
- Convenience Initializer는 반드시 모든 속성을 초기화해야 하는 것은 아닙니다. 보통은 필요한 속성만 초기화 한 다음에 클래스에 있는 다른 생성자를 호출해서 나머지 초기화를 완료하도록 구현합니다.
class Position {
var x: Double
var y: Double
init(x: Double, y: Double) {
self.x = x
self.y = y
}
}
// Designated Initializer의 핵심은 하나입니다. 모든 속성을 초기화 해야합니다.
// Convenience Initializer
class Position {
var x: Double
var y: Double
init(x: Double, y: Double) {
self.x = x
self.y = y
}
convenience init(x: Double) {
self.init(x: x, y: 0.0) // y에는 기본값을 전달
}
}
< 클래스가 상속관계에 포함되어 있는 경우 >
- Designated Initializer는 슈퍼클래스의 Designated Initializer를 호출해야 합니다.
- 반면 Convenience Initializer는 슈퍼클래스에 있는 Initializer를 직접 호출할 수 없습니다. 반드시 동일한 클래스에 있는 생성자를 호출해서 최종적으로 Designated Initializer가 호출되도록 구현해야 합니다.
class Figure {
var name: String
init(name: String) {
self.name = name
}
func draw() {
print("draw \(name)")
}
}
class Rectangle: Figure {
var width: Double
var height: Double // 0.0으로 초기화
}
// 이니셜라이저는 다른 멤버와 마찬가지로 서브클래스로 상속됩니다.
// 다른 멤버는 조건없이 상속되지만 이니셜라이저는 상속 조건이 까다롭습니다. 기본적으로 슈퍼클래스에서 구현된 이니셜라이저는 서브클래스로 상속되지 않습니다.
class Figure {
var name: String
init(name: String) {
self.name = name
}
func draw() {
print("draw \(name)")
}
convenience init() {
self.init(name: "unknown")
}
}
class Rectangle: Figure {
var width: Double = 0.0
var height: Double = 0.0// 0.0으로 초기화
init(name: String, width: Double, height: Double) {
self.width = width
self.height = height
super.init(name: name)
}
override init(name: String) {
width = 0
height = 0
super.init(name: name)
}
convenience init() {
self.init(name: "unknown")
} // 항상 동일한 클래스에 있는 다른 이니셜라이저를 호출합니다. 그리고 슈퍼클래스에 있는 이니셜라이저를 호출하는 것은 불가능합니다. 그래서 오버라이딩이라는 개념이 적용되지 않습니다.
}
스위프트는 두 가지 규칙에 따라 이니셜 라이저를 상속합니다.
- 서브클래스의 모든 속성이 기본값으로 초기화되어 있고 Designated Initializer를 직접 구현하지 않았다면 슈퍼클래스에 있는 모든 Designated Initializer가 상속됩니다.
- 서브클래스가 모든 Designated Initializer를 상속받았거나 오버라이딩 했다면 모든 Convenience Initializer가 상속됩니다.
728x90
'Swift' 카테고리의 다른 글
Extension - 1 (0) | 2020.12.14 |
---|---|
Required Initializer & Failable Initializer (0) | 2020.12.14 |
Initializer & Memberwise Initializer (0) | 2020.12.07 |
AnyObject & Overloading (0) | 2020.12.07 |
Type Casting (0) | 2020.12.07 |