1. 클래스의 2단계 초기화

Swift에서 초기화는 두 단계 과정을 거친ㄷ다

첫 번째 단계에서 저장된 각 프로퍼티는 해당 클래스에 의해 초기값이 할당 됩니다.

첫 번째 단계로 인해 모든 프로퍼티의 초기값이 할당되면, 두 번째 단계로 해당 인스턴스를 사용할 수 있는 상태로 간주하기 전에 프로퍼티 값을 사용자 정의할 수 있는 기회가 제공 됩니다. 두 단계 초기화는 초기화를 안전하게 만들도록 진행합니다

1-1. 1단계 초기화

클래스의 새로운 인스턴스를 위한 메모리가 할당되며, 이때 메모리는 초기화 전이다 지정 초기화는 자신의 프로퍼티 값을 모두 초기화 시킨 후, 부모의 초기화 함수에 전달 됩니다 이 작업은 상속 고리의 최상단 부모 클래스에 도달할 때까지 계속 진행됩니다

이 작업으로 인해 최상위 부모의 프로퍼티까지 모두 기본 값으로 초기화 되면

이때 비로소 instance의 메모리가 완전히 초기화 되었다고 할 수 있으며,

1단계 초기화가 완료된 것입니다.

자 이제 이 긴 공식문서의 내용을 정리해서 보자면

  1. 초기화의 핵심 → 모든 프로퍼티가 초기값을 가져야 한다.
  2. So 지정 초기화를 생성할 경우, super 클래스의 지정 초기화를 반드시 호출 why? ⇒ 부모 클래스의 프로퍼티도 초기화 시켜줘야 하기 때문에!
  3. 따라서 내 프로퍼티를 모두 초기화 & 부모 클래스이 프로퍼티까지 모두 초기화1단계 초기화

즉! 1단계 초기화가 끝났다 = 비로소 인스턴스의 메모리가 완전히 초기화되었다!

Untitled

⭐️ 주의할점

→ 항상 순서는 내 프로퍼티 초기화 후에 부모 클래스 프로퍼티 초기화이다! 아래 코드와 같이 부모 클래스를 먼저 초기화하려고 하면 에러가 난다!

class SoptMember {
    var name: String
    var part: String
    
    // 모든 프로퍼티를 초기화 하는 생성자
    init(name: String, part: String) {
        self.name = name
        self.part = part
    }
}

class PartLeader: SoptMember {
    var alias: String
    
    init(alias: String) {
        super.init(name: "", part: "") // error
        self.alias = alias
    }
}

모든 프로퍼티가 초기화되지 않으면 사용할 수 없다!

Untitled

1-2. 2단계 초기화

최상위 부모 프로퍼티의 생성자까지 모두 호출 되어 1단계 초기화가 완료된 경우,

이때부턴 지정 초기화로부터 인스턴스를 구체화 할 기회를 부여 받습니다

이 단계부터 self에 접근할 수 있으며, 프로퍼티의 값 수정 및 메소드 호출 등등의 작업이 가능합니다

부모 클래스의 저장 프로퍼티 값을 변경할 수 있다

이것도 정리하자면..