꾸준한 기록

[Initializer] Default Initializer, Designated Initializer, Convenience Initializer 본문

Swift

[Initializer] Default Initializer, Designated Initializer, Convenience Initializer

Doo혀니 2023. 11. 8. 22:24

Default Initializer

class struct의 모든 프로퍼티가 기본 값 가지고 아무런 intializer 없으면, default initializer가 제공된다.

 

 

Class의 Initializer: Designated Initializer & Convenience Initializer

Intializer에서 모든 프로퍼티가 초기화되도록 하기 위해, Swift는 class에 2가지 종류의 Initalizer 제공한다.

 

Designated Initializer

- 기본 이니셜라이저.

- 적어도 1개의 designated Initializer 꼭 필요.

- 모든 프로퍼티를 초기화한 후에 슈퍼 클래스의 이니셜라이저를 호출해야 함.

init(<#parameters#>) {
   <#statements#>
}

 

Convenience Initializer

- 보조 이니셜라이저.

- 필요없다면 정의하지 않아도 됨.

- designated initializer의 매개변수 중 일부에 기본값 지정 가능.

- 특정 상황마다 동일한 매개변수 값을 가지고 Intializer를 호출하는 경우, convenience initializer를 이용해 편리하게 사용 가능.

convenience init(<#parameters#>) {
   <#statements#>
}

 

class 상속관계에서 Designated Initializer, Convenience Initializer 규칙 

class를 상속하여, parent class와 child class가 존재할 때 다음 규칙을 지켜야 한다.

 

1. child class 의 designated initializer는 parent class의 designated initializer를 반드시 호출해야 함.

2. convenience initializer는 같은 class의 다른 initializer를 무조건 호출해야 함.

3. convenience intializer는 최종적으로 designated initializer를 호출해야 함.

 

 

규칙 3번에 대해서 부연 설명하기 위해 Swift 공식문서에 있는 그림을 가지고 왔다.

그림에서 superclass의 convenience initializer는 다른 convenience initializer를 호출하고, 이 이니셜라이저는 다시 designated initizlier를 호출한다. 이렇듯 convenience intializer로 부터 시작되어 연쇄적으로 initializer가 호출되는데, 가장 마지막에 호출되는 initialzier는 최종적으로 designated initializer가 되어야 한다. subclass의 경우도 마찬가지다. child의 convenience initializer ➡️ child의 designated initializer ➡️ parent의 designated initialzer 순으로 호출되어, child 와 parent 의 designated initializer가 반드시 호출된다.

'Swift' 카테고리의 다른 글

[Concurrency] DispatchQueue.main.async 를 대체하는 방법  (0) 2024.08.27
[Swift 6] Typed Throws  (0) 2024.08.21
Swift 6 의 새로운 기능  (0) 2024.06.11
[WWDC23] Meet SwiftData  (1) 2023.11.02
[Combine] Publisher, Subscriber, Operator  (0) 2022.03.28