1. Initializer Delegation

생성자에서 또 다른 생성자를 호출하여 초기화 코드의 중복을 최대한 제거하고, 모든 프로퍼티를 효율적으로 초기화 하기위해 사용하는 것

왜 필요한가?

우리가 아래 같은 구조체를 초기화하는 상황에서, 다양한 상황에 따라 다양한 생성자를 만들 수 있다.

struct SoptMember {
    var name: String
    var part: String
    
    init(name: String, part: String) {
        self.name = name
        self.part = part
    }

    init(name: Int) {
        self.name = name
        self.part = name
    }
}

그러나 이렇게 만들 경우 프로퍼티 한개를 따로 초기화하게 된다면, 모든 생성자의 코드를 바꿔줘야 한다.

⇒ Initializer Delegation을 활용해서 생성자에서 "또 다른 생성자"를 호출하여 초기화 코드의 중복을 최대한 제거하자!

Initializer Delegation은 값 타입과 참조 타입에 따라 형식이 다르다! 이제부터 알아보자!

// 프로퍼티 한개를 따로 초기화하게 된다면, 모든 생성자의 코드를 바꿔줘야 한다.
struct SoptMember {
    var name: String
    var part: String
    
    init(name: String, part: String) {
        self.name = name
        self.part = "아요"
    }

    init(name: Int) {
        self.name = name
        self.part = "아요"
    }
}

2. 구조체에서 Initializer Delegation

모든 프로퍼티를 초기화 하는 Initializer를 먼저 하나 만들고, 다른 Initializer가 이 Initializer를 사용하게 만드는 것!

⇒ 유지 보수가 쉬워진다!

struct SoptMember {
    var name: String
    var part: String
    
    // 모든 프로퍼티를 초기화 하는 생성자
    init(name: String, part: String) {
        self.name = name
        self.part = part
    }
        
    // 그 생성자를 활용한 생성자를 만들면 된다!
    init(name: String) {
        self.init(name: name, part: "iOS")
    }
}

3. 클래스에서 Initializer Delegation

클래스도 비슷한 맥락이지만! 상속의 개념이 있기 때문에 이 부분을 고려해줘야 한다! 아래서 설명한 두 가지를 지켜야만 가능하다! 일단 클래스는 기본적으로 생성자가 모든 프로퍼티를 초기화하고 → Convenience Initializers로 도와주기 때문에 이 방식이 바로 Initializer Delegation!

저번 아티클 정리하는 느낌쓰..?

3-1. Delegate Up

Designated Initializer는 반드시 슈퍼 클래스의 Designated Initializer를 호출해야 합니다.

Untitled