클래스의 상속과 이니셜라이저
슈퍼클래스를상속받는 프로퍼티들을 포함하여 모든 클래스의 저장 프로퍼티들은 초기값을 이니셜라이즈 해주어야 합니다. 스위프트에서는
- 지정 이니셜라이저 (Designated Initializer)
- 편의 이니셜라이저 (Convenience Initializer)
를 통해 클래스의 모든 프로퍼티들이 이니셜라이저가 될 수 있도록 도와줍니다.
지정 이니셜라이저와 편의 이니셜라이저
지정 이니셜라이저는 클래스의 기초적 이니셜라이저입니다. 슈퍼클래스의 이니셜라이저를 통해 초기값을 세팅하는 것을 도와줍니다. 지정 이니셜라이저의 특징으로는
- 클래스는 적은 지정 이니셜라이저 (보통 1개)를 가짐
- 깔때기(funnel)와 같은 포인트를 통해 어떤 이니셜라이저를 호출할 지 정함
- 모든 클래스는 적어도 하나의 지정 이니셜라이저를 가짐
펀의 이니셜라이저는 클래스의 이니셜라이즈를 도와주는 보조적인 이니셜라이저 입니다. 지정 이니셜라이저의 인자를 기본값으로 바꿔주기 위해 편의 이니셜라이저를 정의해 지정 이니셜라이저를 부르는 형식을 따르기도 합니다. 편의 이니셜라이저는
- 클래스 설정에 필요하지 않다면 호출하지 않아도 됨
- 공통적인 이니셜라이저가 필요하다면 편의성을 위해 사용
지정, 편의 이니셜라이저의 문법적 표현
지정 이니셜라이저는
편의 이니셜라이저는
와 같이 표현할 수 있습니다.
클래스 타입에 대한 이니셜라이저 위임
지정 및 편의 이니셜라이저의 관계를 간단히 하자면 3가지 규칙으로 나눌 수 있는데
1번째 규칙:
- 지정 이니셜라이저는 자신 상위에있는 슈퍼클래스의 지정 이니셜라이저를 꼭 호출해주어야 한다.
2번째 규칙:
- 편의 이니셜라이저는 같은 클래스에서 또 다른 이니셜라이저를 꼭 호출해주어야 한다.
3번째 규칙:
- 편의 이니셜라이저는 궁극적으로는 꼭 지정 이니셜라이저를 호출해주어야 한다.
그리고 간단하게 정리를 하자면
- 지정 이니셜라이즈는 위로만 위임이 가능
- 편의 이니셜라이저는 옆으로만 위임이 가능
슈퍼클래스는 하나의 지정 이니셜라이저와 두개의 편의 이니셜라이저를 가지고 있습니다. 하나의 편의 이니셜라이저는 하나의 지정 이니셜라이저를 호출하고있는 또 다른 편의 이니셜라이저를 호출합니다. 이는 규칙 2번과 3번을 준수합니다. 슈퍼클래스는 자신의 슈퍼클래스를 가지고 있지 않기때문에 규칙 1번을 준수하지는 못합니다.
서브클래스는 두개의 지정 이니셜라이저와 하나의 편의 이니셜라이저를 가지고 있습니다. 편의 이니셜라이저는 두개의 지정 이니셜라이저중 하나는 무조건 호출을 해야하는데 이는 같은 클래스에서 다른 이니셜라이저를 무조건 호출해야 하기 때문입니다. 이는 규칙 2,3번을 따르고 있습니다. 지정 이니셜라이저들은 규칙 1번을 따르기 위해서는 슈퍼클래스에서 하나의 지정 이니셜라이저를 호출해야만 합니다.
이와 같은 규칙은 각각의 클래스의 인스턴스를 만드는 데에 영향을 주지는 않습니다. 위의 다이어그램에서, 어떠한 이니셜라이저든 최대한 초기화된 인스턴스를 만들기 위해 사용됩니다. 그러므로 이 규칙들은 클래스의 초기화의 구현에서만 적용 됩니다.