본문 바로가기
#모바일 [Mobile]/iOS

[iOS] Swift 초기화 (Initialization)

by cy_mos 2022. 2. 24.
반응형

 

초기화 (Initializer)는 클래스 (Class), 구조체 (Struct) 또는 열거형 (Enum)을 사용하기 위한 준비하는 초기 과정입니다. 각각의 저장 속성을 위해 초기화된 값을 설정하는 것과 사용하기 위한 새로운 인스턴스르 준비하기전에 필요한 그외 다른 설정 또는 초기화를 진행 작업을 수행합니다.

 

또한, Initalizer는 SuperClass와 SubClass 간에 상속이 이루어지며 크게 두 가지의 형태로 상속이 이루어집니다.

 

  • Designated Initalizer와 Convenience Initalizer 모두 상속하는 경우
    • 자식 클래스 (Child Class)에 Desinated Initalizer가 없는 경우
    • 자식 클래스 (Child Class)에 초기화가 필요한 Properties가 존재하지 않는 경우
  • Convenience Initalizer 단독으로 상속하는 경우
    • 자식 클래스 (Child Class)에서 부모 클래스 (Parent Class)의 Designated Initalizer를 Override 하는 경우

 

아래의 이미지는 Initalizer에 대한 SuperClass와 SubClass 호출 흐름도입니다.

 

Designated Initializers and Convenience Initializers


🛠 Designated Initializer

Designated Initializer는 Class에 명시 된 모든 Properties에 대하여 반드시 초기화 작업을 수행하는 Initializer 입니다. 또한, 모든 Class는 반드시 하나 이상의 Designated Initalizer를 포함하고 있어야합니다.

 

아래의 소스코드와 같이 Class 내부에 Properties들을 명시하여 초기화 작업을 수행해야하며 Class 생성 시 자동으로 생성되는 init 함수가 Designated Initalizer 입니다.

 

아래는 예제 Designated Initalizers Source Code 입니다.

 

class Person {

    var name: String
    var age: Int
    var gender: String

    init(name: String, age: Int, gender: String) {
        self.name = name
        self.age = age
        self.gender = gender
    }
}

🛠 Convenience Initializers

Convenience Initalizer는 보조 이니셜라이저로 단독으로 초기화가 불가능하며 일부의 Properties에 대하여 초기화 작업을 수행하는 Initalizer 입니다. 즉, 쉽게 말하여 self.init() 사용하여 다른 Initalizer를 통하여 초기화 작업을 수행합니다. 다양한 방법으로 객체를 생성할 때 Initalizer Overrading 작업을 통해서 발생하는 코드 중복을 줄일 수 있습니다. 또한, Convenience Initalizer 정의하기 이전에는 반드시 Designated Initalizer 존재하여야만 정의가 가능합니다.

 

Designated and Convenience Initializers in Action

 

아래는 예제 Convenience Initalizers Source Code 입니다.

 

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)
    }
}

🛠 Failable initializers

Failable initializers – Swift in Sixty Seconds

 

Failable Initializers는 Class, Structure, Enum 같은 형태에서 사용할 수 있으며 초기화 과정 중에 초기화 과정에 필요한 조건을 만족하지 않아서 실패가 발생하게 된다면 nil을 반환합니다. Failable initalizer는 init? 형태로 정의됩니다.

 

아래는 예제 Failable Initalizers Source Code 입니다.

 

struct Person {
    var id: String

    init?(id: String) {
        if id.count == 9 {
            self.id = id
        } else {
            return nil
        }
    }
}

🛠 Required Initializers

Required Initalizers는 부모 클래스 (Parent Class)의 모든 자식 클래스 (Child Class)에서 해당 Initalizer는 반드시 구현하여야 합니다. Required Initalizers는 required init 형태로 정의됩니다. 또한, 자식 클래스 (Child Class)에서 Required Initalizer Override 하는 경우에는 반드시 required init 형태로 구현을 하여야 합니다.


🚀 REFERENCE

반응형

댓글