생성자에서 또 다른 생성자를 호출하여 초기화 코드의 중복을 최대한 제거하고, 모든 프로퍼티를 효율적으로 초기화 하기위해 사용하는 것
우리가 아래 같은 구조체를 초기화하는 상황에서, 다양한 상황에 따라 다양한 생성자를 만들 수 있다.
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 = "아요"
}
}
모든 프로퍼티를 초기화 하는 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")
}
}
클래스도 비슷한 맥락이지만! 상속의 개념이 있기 때문에 이 부분을 고려해줘야 한다! 아래서 설명한 두 가지를 지켜야만 가능하다! 일단 클래스는 기본적으로 생성자가 모든 프로퍼티를 초기화하고 → Convenience Initializers로 도와주기 때문에 이 방식이 바로 Initializer Delegation!
저번 아티클 정리하는 느낌쓰..?
⇒ Designated Initializer는 반드시 슈퍼 클래스의 Designated Initializer를 호출해야 합니다.