Swift에서 초기화는 두단계 과정을 거친다
첫 번째 단계에서 저장된 각 프로퍼티는 해당 클래스에 의해 초기값이 할당 된다.
두 번째 단계에서 해당 인스턴스를 사용할 수 있는 상태로 간주하기 전에 프로퍼티 값을 사용자 정의할 수 있는 기회가 제공 된다.
두 단계 초기화는 초기화를 안전하게 만들도록 진행한다.
1단계 초기화에선 클래스의 새로운 인스턴스를 위한 메모리가 할당되며, 이때 메모리는 초기화 전이다. 지정 초기화는 해당 클래스의 프로퍼티에 초기값이 있음을 확인하여 그 값으로 초기화 한다. 지정 초기화는 자신의 프로퍼티 값을 모두 초기화 시킨 후, 부모의 초기화 함수에 전달된다. 이 작업은 상속 고리의 최상단 부모 클래스에 도달할 때까지 계속 진행된다.
이 작업으로 인해 최상위 부모의 프로퍼티까지 모두 기본 값으로 초기화 되면 이때 비로소 instance의 메모리가 완전히 초기화 되었다고 할 수 있으며, 1단계 초기화가 완료된 것이다.
=> 내 프로퍼티를 모두 초기화 하고 super.init을 통해 부모 클래스의 초기화 까지 진행 = 1단계 초기화

최상위 부모 프로퍼티의 생성자까지 모두 호출 되어 1단계 초기화가 완료된 경우, 이때부턴 지정 초기화로부터 인스턴스를 구체화 할 기회를 부여 받는다. 이단계부터 self에 접근할 수 있으며, 프로퍼티의 값 수정 및 메소드 호출 등등의 작업이 가능.
부모 클래스의 저장 프로퍼티 값을 변경할 수 있다.
=> 1단계 초기화가 완료 되었다면, 가장 마지막으로 호출됐던 상위 클래스의 남은 작업부터 차례로 아래로 실행됨


부모의 초기화에 의해 내가 설정한 값이 덮어지는 문제를 방지하기 위해
클래스의 Initializer는 총 두가지 조건에 의해 상속
Swift 서브 클래스는 기본적으로 슈퍼클래스 이니셜라이저를 상속받지 않음
class Human {
var name: String
init(name: String) {
self.name = name
}
convenience init(unknown: String) {
self.init(name: unknown)
}
}
class Sodeul: Human {
var nickName: String
override init(name: String) {
nickName = name
super.init(name: name)//오버라이드 할 때도 super.init호출해줘야함
}
}
Sodeul.init(unknow: "abc")//부모 편의 초기화 사용 가능
참조
개발자 소들이