이전 글에서 초기화를 알아보았다. 그런데 그 과정에서 Two Phase Initialization이라는 생소한 단어를 보았다면 잘 왔다. Swift는 상속 과정에서 모든 instance의 property의 값이 보장되기 위한 방법으로 2단계 초기화 방법을 사용한다. 예시를 기반으로 작성했으니 쉽게 이해가 가능할 것이다. 생각보다 별 것 없으니 겁먹지 말자. 쉽게 이해하고 싶다면 모든 property의 초기화를 보장하기 위한 방법이라는 것을 염두에 두고 글을 읽자. 그럼 시작해보자.
class drink {
var size: String
init() {
// self.describe() // 내부 속성이 초기화되지 않았기 때문에 사용불가
self.size = "Tall"
self.describe()
print("2단계")
print("self 가능")
}
func describe() {
print("Drink!")
}
}
class Coffee: drink {
var price: Int
override init() { // 역할 : 해당 클래스 인스턴스의 모든 속성값이 설정되어 있는지 체크
// 그래서 init을 먼저 호출하면 안됨..
self.price = 5700
super.init()
self.size = "sdgsd"
}
convenience init(size: String, price: Int) {
print("1단계 시작")
print("self 불가능")
self.init() // 순서 바꾸면 작동 안함 : 지정 생성자를 먼저 타고 올라가야 self 접근 가능..
self.size = size
self.price = price
}
}
let coffee = Coffee(size: "tall", price: 5600)
호출되는 과정을 따라가 보도록 하겠다.
size
를 변경할 수 있다.해당 방법을 확인하기 위해서는 break point를 걸고 debugger에서 po self
와 같은 명령어를 통해 접근이 가능한지 확인할 수 있다.
위의 방법을 이해했다면 앞으로 나오는 규칙은 사실 당연하게 이해할 수 있다.