Default Initializer
스위프트에서는 init() 메소드를 사용하지 않아도 기본적으로 제공하는 Default Initializer가 있다.
기본 생성자를 사용하기 위한 조건으로는 아래와 같다.
1. 모든 프로퍼티가 초기 값을 가져야 한다. |
2. 부모 클래스가 없어야 한다. |
위의 예제는 기본 생성자를 사용한 예제이다. name과 age는 peopleClass 내부에서 설정한 Default Value로, 옵셔널 타입으로 지정 된 nationality는 nil이 반환되어 출력된다.
✅ Default init을 사용하기 위해서는 주의할 점이 있는데,
각 프로퍼티에 초기값을 설정해야한다. 초기값을 설정하지 않으면 아래와 같이 에러가 발생한다.
Memberwise Initializer
구조체는 클래스와 달리 Memberwise init이 존재한다. 위에서 설명한 Default init과 비슷한데,
Memberwise init은 프로퍼티에 초기값을 설정하지 않아도 사용할 수 있다.
각 프로퍼티에 초기값을 설정하지 않았지만, Memberwise init을 사용하면 간편하게 초기화 할 수 있다.
✅ Memberwise init을 사용하기 위해서는 주의할 점이 있는데,
위와 같이 Customizing init을 사용할 경우 Meberwise init을 사용할 수 없다.
Initializer Delegation
Initializer Delegation는 init() 메소드 안에서 다른 종류의 init() 메소드를 호출하는 것을 뜻한다.
✅ Initializer Delegation은 여러 생성자 사이에 코드가 중복되는 것을 방지한다.
✅ 값 타입(구조체, enum)은 상속을 허용하지 않기 때문에 이니셜라이저 위임이 클래스보다 간단하다.
struct Size {
var width = 0.0, height = 0.0
}
struct Point {
var x = 0.0, y = 0.0
}
struct Rect {
var origin = Point()
var size = Size()
init() {}
init(origin: Point, size: Size) {
self.origin = origin
self.size = size
}
init(center: Point, size: Size) {
let originX = center.x - (size.width / 2)
let originY = center.y - (size.height / 2)
self.init(origin: Point(x: originX, y: originY), size: size)
}
func printValue() {
print("Origin Values = \(self.origin), Size Values = \(self.size)")
}
}
let basicRect = Rect()
basicRect.printValue()
let originRect = Rect(origin: Point(x: 2.0, y: 2.0), size: Size(width: 5.0, height: 5.0))
originRect.printValue()
let centerRect = Rect(center: Point(x: 4.0, y: 4.0), size: Size(width: 3.0, height: 3.0))
centerRect.printValue()
위의 예제는 스위프트 공식문서의 예제이다.
사이즈 정보를 담고 있는 Size 구조체, 점의 위치를 담고 있는 Point 구조체, 사각형의 정보를 담고 있는 Rect 구조체가 있다.
Rect 구조체에는 세 개의 Customizing init을 가지고 있는데
init() {} | 기본 생성자 (생략 가능) |
init(origin: Point, size: Size) {} | origin과 size 값을 인자로 받는 생성자 |
init(center:Point, size: Size) {} | center와 size 값을 인자로 받아와 originX,Y를 계산하여 초기화 하는 생성자 |
여기서 눈여겨 봐야할 생성자는 세번째 생성자이다.
init(center: Point, size: Size) {
let originX = center.x - (size.width / 2)
let originY = center.y - (size.height / 2)
self.init(origin: Point(x: originX, y: originY), size: size)
}
center와 size 값을 인자로 받아와 originX,Y를 계산한 후
self.init(origin: Porint(x: originX, y: originY), size: size) 구문을 통해 Rect 구조체의 init(origin: size:) 메소드를 호출한다.
이것이 바로 생성자 위임(Initializer Delegation)이다.
✅ Memberwise init을 사용하기 위해서는 주의할 점이 있는데,
위와 같이 Customizing init을 사용할 경우 Meberwise init을 사용할 수 없다.
위에서 설명한 Meberwise init을 사용할 때 주의점이다.
마찬가지로 생성자 위임을 할 때도 적용 되는데, customizing init을 사용하면서 Memberwise init을 사용하고 싶으면 extension(확장)을 통해 구현하면 된다.
'Swift > Swift 기본기' 카테고리의 다른 글
14. 생성자 (Initialization) - 4 (0) | 2023.08.02 |
---|---|
13. 생성자 (Initialization) - 3 (0) | 2023.08.02 |
11. 생성자 (Initialization) - 1 (0) | 2023.08.01 |
10. 제네릭 (Generic) (0) | 2023.07.31 |
09. 프로퍼티 (Properties) (0) | 2023.03.18 |