swift & iOS/swift

[swift] init 메소드의 종류

whale3 2022. 2. 3. 13:43

이전 포스팅 '프로퍼티를 초기화 하는 3가지 방법' 중에 init 메소드를 작성하는 방법이 있었다. 여기서는 init 메소드의 종류에 대해 정리하려고 한다. 

 

이번에도 역시 유튜브 이 영상을 참고했다. 


1. designated initializer

클래스의 모든 프로터피를 초기화 하는 initializer이다. 클래스 내에 초기화 되지 않은 프로퍼티가 있다면 클래스 내에 최소 한 개 이상의 designated initializer를 작성하여 프로퍼티를 초기화 해주어야 한다. 

클래스 내에 초기화 되지 않은 프로퍼티가 있는데 init에서 모든 프로퍼티를 초기화 하지 않아서 경고 메시지가 나왔다

그리고 초기화가 끝나지 전에 다른 메소드를 호출할 수 없다. 다른 메소드 중에 프로퍼티에 접근하는 메소드가 있으면 어떡해,,,

 

2. convenience initializer

일부 프로퍼티만 초기화 하기 때문에 self.init() 처럼 이미 작성된 init 메소드를 호출해야 한다. 말 그대로 '편의'를 위한 initializer이기 때문에 이건 있어도 되고 없어도 된다.

그렇다면 무슨 '편의'를 위한 것일까? 다양한 객체를 만들 수 있도록 하려면 그만큼 여러 개의 init 메소드를 오버로딩 overloading 해야 하는데 그러면 init 메소드 내부에 중복되는 코드가 많아질 수 밖에 없다. 그래서 중복을 조금이나마 줄이기 위해 convenience initializer를 사용한다고 한다. 

// 참고: https://docs.swift.org/swift-book/LanguageGuide/Initialization.html

class Food {
    var name: String
    var quanity: Int
    
    init(name: String, quantity: Int) {
        self.name = name
        self.quanity = quantity
    }
    convenience init(quantity: Int) {
        self.init(name: "Unnamed", quantity: quantity)
    }
}

// name과 quantity를 모두 전달하여 객체를 만들거나
let myFood = Food(name: "pizza", quantity: 2)
print(myFood.name, myFood.quanity) // pizza 2

// quantity만 전달하여 객체를 만들수도 있다.
let yourFood = Food(quantity: 0)
print(yourFood.name, yourFood.quanity) // Unnamed 0

하나 더 예를 만들었는데, 

enum Gender {
    case Female, Male, NonBinary
}

class Person {
    var name: String
    var height: Double
    var gender: Gender
    
    init() {
        self.name = "Unnamed"
        self.height = 0.0
        self.gender = Gender.NonBinary
    }
    
    init(name: String) {
        self.name = name
        self.height = 0.0
        self.gender = Gender.NonBinary
    }
}

객체를 만들 때 아무것도 넘기지 않거나 name을 넘겨서 만들 수 있도록 두 가지 init 메소드를 작성했다. init 내부에 보면 height과 gender 부분이 중복되어 있다. 이 때 convenience initializer를 사용하면 이처럼 중복된 부분을 조금은 줄일 수 있다.

class Person {
    var name: String
    var height: Double
    var gender: Gender
    
    init() {
        self.name = "Unnamed"
        self.height = 0.0
        self.gender = Gender.NonBinary
    }
    
    convenience init(name: String) {
        self.init()
        self.name = name
    }
}

 

3. failable initializer

https://what-whale-wants-to-say-is.tistory.com/78

 

[swift] failable initializer

클래스, 구조체, 열거형을 초기화 할 때 필요한 프로퍼티를 모두 제공하지 않거나 유효한 프로터피를 제공하지 않거나 아니면 다른 어떤 이유로 초기화가 실패할 수 있다. 그런 경우에 대비에

what-whale-wants-to-say-is.tistory.com

 

반응형