GGURUPiOS

[Swift] Designated Initailizers & Convenience Initializers 본문

Swift/문법 파헤치기

[Swift] Designated Initailizers & Convenience Initializers

꾸럽 2023. 10. 31. 19:04

안녕하세요.

이번시간은 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를 가지고 있습니다.

그림으로 나타내면 다음과 같습니다.

 

그 외에도 많은 내용이 있지만 여기 다 적기엔 글이 너무 길어져
이 쯤 마무리 하겠습니다