본문 바로가기

Swift/Deep dive!!

[Swift] 클래스 2단계 초기화와 안전점검 완벽 이해!!

 

 



클래스와 초기화에 대한 개념이 가물~가물 하다면?! -> 클래스와 초기화 글 다시보기

클래스에서 자동, 지정 초기화, 편리 초기화 개념이 가물~가물~ 하다면?! -> 자동, 지정, 편리 초기화 글 다시보기


2단계 초기화

 

클래스 초기화는 2 단계를 거쳐서 진행된다.

  1. 해당 클래스의 저장 프로퍼티는 초기값으로 모두 초기화 ( 부모 또한 super Designated or 자식 클래스에서 전부 초기화)
  2. 자식방향으로 내려오며 초기화된 프로퍼티 중 일부를 필요에 맞게 커스터마이징 하는 단계

 2 단계에서  에러없이 초기화가 완료되었음을 보장하기 위해 4단계 안전 점검을 진행한다.


안전 점검 단계

 

  안전 점검 1

지정 초기화 메소드는 부모 초기화 메소드 호출 전에, 해당 클래스에서 정의 된 모든 저장 프로퍼티 초기화 해야 한다.

  안전 점검 2

상속받은 저장 프로퍼티 직접 초기화 하려면, 이전에 부모 초기화 메소드 호출 해야한다.
그렇지 않을 경우 자신이 해당 프로퍼티 초기화 한 이후에 부모 클래스가 다시 지정된 다른 값으로 초기화 진행 할 수 있음,,

  안전 점검 3

편의 초기화에서 저장 프로퍼티 직접 초기화 하려면 그 이전에 다른 초기화 메소드를 호출 해주어야 한다.
 그렇지 않을 경우 안전점검 2와 유사한 상황처럼 Concenience에서 초기화한 저장 프로퍼티를 Designated에서 다시 초기화 할 수 있기 때문,,

  안전 점검 4

1단계 초기화가 끝나기 전에는 인스턴스 메소드 사용 x . 인스턴스 프로퍼티 읽을수도 없고, self 참조 불가. (1단계 진행 안되면 메모리에 할당 안됬어 아직)


클래스 초기화 1단계 과정

 

// 재은씨 실전편 p 449 참고

  클래스 초기화 1단계 과정

1. 클래스에서는 Designated or Convenience init 호출
2. 해당 클래스 타입의 변수에 메모리 할당됨 ( but 메모리 초기화 x)
3. 지정 초기화 호출되며 해당 클리스의 변수들이 초기화 된다. 아직 super클래스의 Designated 호출 x
4. 해당 클래스의 변수 초기화 이후 super의 Designated를 호출하며 부모 클래스의 저장 프로퍼티들 초기화
5. 초기화 메소드의 연쇄 호출 과정에 의해 최상의 super Designated 가 호출될때까지 3, 4 과정 반복


클래스 초기화 2단계 과정


  클래스 초기화 2단계 과정

1단계 과정에서 초기화된 저장 프로퍼티 중 원하는 것들만 원하는 값으로 덮어 씌우는 과정

1. 계층의최상의 클래스에서 자식 클래스로 내려간다.
2. 지정 초기화 메소드의 뒷부분에서 필요한 커스터마이징이 실행됨!!!?!!?!?
3. 1, 2과정 반복

이제 self메서드, 인스턴스 메소드를 참조할 수 있다.