GGURUPiOS
[Swift] Designated Initailizers & Convenience Initializers 본문
안녕하세요.
이번시간은 Designated initializers 와 Convenience Initializers 에 대해 알아보겠습니다!
Designated Initializers & Convenience Initializers?
두 이니셜라이저는 모두 클래스의 초기화에 사용되는 이니셜라이저이다.
Designated Initializers?
Designated Initializers는 클래스의 기본 이니셜라이저 입니다.
- 모든 프로퍼티를 완전히 초기화함
- 적절한 슈퍼클래스 이니셜라이저를 호출하여 초기화 프로세스를 진행
- 클래스에는 거의 없는 경우가 많거나, 하나만 있는 경우도 매우 흔함
(아마도 자동상속 규칙1 때문에 이니셜라이저가 자동상속 되는 경우가 많기 때문인 듯 함
규칙 1
서브클래스에 Designated Initializer가 정의되어 있지 않은 경우,
슈퍼클래스의 Designated Initializers 모두 자동으로 상속합니다.) - 모든 클래스에는 Designated Initializers가 하나이상 있어야 함
Convenience Initializers?
Convenience Initializers는 이니셜라이저를 지원하는 보조 이니셜라이저입니다.
- Convenience Initializers를 정의하여 Designated Initializers 를 호출하고 Designated Initializers의
일부를 기본값으로 설정 가능 - 말 그대로 편리하게 초기화를 도와주는 이니셜라이저 정도로 생각하면 될 듯
어떻게 사용할까?
기본 문법은 아래와 같다
// Designated Initializers
init(<#parameters#>) {
<#statements#>
}
// Convenience Initializers
convenience init(<#parameters#>) {
<#statements#>
}
공식문서에 따르면 아래와 같이 세가지 규칙이 있고, 그걸 따르면 된다.
- Designated Initializers는 바로 위 슈퍼클래스의 Designated Initializers를 호출해야 함
- Convenience Initializers는 같은 클래스의 다른 이니셜라이저를 호출해야 함. (convenience -> convenience 가능)
- Convenience Initializers는 궁극적으로 Designated Initializers를 호출해야 함.
Designated Initializers는 위로 가야하고
Convenience Initializers 는 항상 옆으로 가야한다.
아래의 예시에서 살펴봅시다.
class RecipeIngredient: Food {
var quantity: Int
init(name: String, quantity: Int) {
self.quantity = quantity
super.init(name: name)
}
override convenience init(name: String) {
self.init(name: name, quantity: 1)
}
}
RecipeIngredient는 Food를 상속받으며, 한개의 Designated Initializers를 가지고 있습니다.
그림으로 나타내면 다음과 같습니다.
그 외에도 많은 내용이 있지만 여기 다 적기엔 글이 너무 길어져
이 쯤 마무리 하겠습니다
'Swift > 문법 파헤치기' 카테고리의 다른 글
[Swift] Optional 이란 무엇일까? (0) | 2023.11.01 |
---|---|
[Swift] AnyObject, AnyClass, Any 에 대해 알아보기 (0) | 2023.11.01 |
[Swift] Copy-on-Write과 메모리할당 (1) | 2023.10.31 |
[Swift] Dynamic Dispatch를 줄여 Class의 성능 향상시키기 (2) | 2023.10.30 |
[Swift] Struct vs Class vs Enum 공통점과 차이점 (0) | 2023.10.30 |