티스토리 뷰

전체 정리

지정 초기화 자동 상속조건 잘 이해하고, 언제 부모 클래스의 지정 초기화를 호출해야하는지를 이해해라. 또 프로퍼티를 바로 할당하지 않고 초기화 메소드에서 초기화한다면, 내 클래스 것 먼저 초기화하고 부모의 지정 초기화 메소드를 호출해야 한다(이것이 1단계 초기화). 이 초기화가 끝나면 각자 입맛에 맞게 프로퍼티 초기화, 메소드 호출 등을 할 수 있게 된다(self 참조도 이때부터 안전하게 가능)

 

초기화 종류

스위프트에는 두 가지 종류의 초기화 메소드가 있습니다. 바로 지정 초기화 메소드(designated initializer)와 편의 초기화 메소드(convenience initializer)입니다. 둘 사이에는 호출 규칙이 3가지 있습니다.

 

호출규칙1.

지정 초기화 메소드는 부모 클래스의 초기화 메소드를 호출해야 함(이때 반드시 자신의 저장 프로퍼티는 초기화 되어 있어야 함).

 

호출규칙2.

편의 초기화 메소드는 반드시 같은 클래스 내의 다른 초기화 메소드를 호출해야 함.

 

호출규칙3.

편의 초기화 메소드는 최종적으로는 반드시 지정 초기화 메소드를 호출해야 함.

 

호출규칙 3가지를 간단하게 기억하려면, 지정 초기화 메소드는 위쪽으로 수직적으로 호출이 일어나고 편의 초기화 메소드는 같은 레벨에서 수평적으로 호출이 일어난다고 생각하면 됩니다.

호출방향 (https://docs.swift.org/swift-book/LanguageGuide/Initialization.html#ID216)

 

초기화 호출의 단계(1단계, 2단계)

초기화 호출은 1단계, 2단계로 나뉩니다. 1단계는 새로 생성되는 인스턴트의 메모리를 할당받고, 자기 자신 클래스와 모든 부모 클래스의 저장 프로퍼티를 완전하게 초기화함으로써 인스턴스의 메모리가 완전히 초기화되는 것을 말합니다. 2단계는 초기화 메소드 별로 self를 참조하거나 메소드를 호출, 프로퍼티값을 수정하는 등 커스터마이징이라고 생각하면 됩니다.

1단계 초기화 (https://docs.swift.org/swift-book/LanguageGuide/Initialization.html#ID216)
2단계 초기화 (https://docs.swift.org/swift-book/LanguageGuide/Initialization.html#ID216)

 

초기화 안전점검

초기화 메소드의 호출을 할 때는 몇 가지 안전점검 사항이 있습니다. 이는 클래스의 프로퍼티가 완전히 초기화되기 전에 메소드가 호출되거나 참조되는 것을 막기 위함입니다(self 참조 등).

 

안전점검1. 지정 초기화 메소드는 부모의 초기화 메소드를 호출하기 전 반드시 자기 자신의 프로퍼티를 초기화 해야 한다.

 

안전점검2. 지정 초기화 메소드는 상속된 프로퍼티에 값을 할당하기 전 반드시 부모의 초기화 메소드를 호출해야 한다. 그렇지 않으면 부모 초기화 메소드가 다시 초기화를 해버릴 수 있다.

 

안전점검3. 편의 초기화 메소드는 프로퍼티에 값을 할당하기 전(상속된 것이든 자기 클래스 것이든) 반드시 다른 초기화 메소드를 호출해야 한다. 역시 같은 이유로, 이미 초기화된 프로퍼티를 다른 초기화 메소드가 초기화할 수 있기 때문이다.

 

안전점검4. 초기화 메소드는 1단계 초기화가 끝나기 전에는, 인스턴스 메소드를 호출하거나, 인스턴스 프로퍼티의 값을 읽거나, self를 참조하는 등의 행위를 할 수 없다.

 

초기화 자동 상속

클래스의 초기화 메소드는 자동으로 생성되기도 하지만(모든 저장 프로퍼티에 디폴트값이 할당되어 있고, 지정 초기화 만들지 않은 경우 기본 초기화 제공함) 모든 조건을 충족하는 경우 부모의 것이 자동으로 상속되기도 합니다.

 

자동상속 규칙1.

상속한 클래스가 지정 초기화 메소드를 아무것도 정의하지 않은 경우, 부모 클래스의 모든 지정 초기화 메소드를 자동으로 상속한다

 

자동상속 규칙2.

부모 클래스의 모든 지정 초기화 메소드를 구현한 경우(자동상속 규칙1에 의해 상속받은 것도 포함함), 부모 클래스의 모든 편의 초기화 메소드를 자동으로 상속한다.

 

단, 이 두가지 규칙은 상속 클래스의 모든 저장 프로퍼티에 디폴트 값이 지정되어 있는 경우에만 적용됩니다.

 

 

출처

https://docs.swift.org/swift-book/LanguageGuide/Initialization.html#ID216

댓글