클래스의 이니셜라이저
- 클래스가 부모 클래스에서 상속한 모든 속성을 포함하여 모든 클래스의 저장 속성은 초기화 하는 동안 초기 값을 지정해줘야 한다.
- 스위프트는 모든 저장 프로퍼티가 초기 값을 가지는 데에 편리하도록 클래스 유형에 대해 두 가지 이니셜라이저를 정의 한다.
지정 이니셜라이저(Designated Initializer)
- 클래스의 모든 저장 프로퍼티를 초기화 한다.
- 부모 클래스의 이니셜라이저를 호출할 수 있다.
- 클래스 내부에는 반드시 한 개 이상의 지정 이니셜라이저가 있어야 한다.
init(매개 변수) {
// 구현부
}
편의 이니셜라이저(Convenience Initializer)
- 지정 이니셜라이저의 일부 매개 변수의 기본 값을 설정하여 초기화 한다.
- 더 적은 입력으로 초기화를 편리하게 할 수 있게 해준다.
convenience init(매개 변수) {
// 구현부
}
- 예제
이니셜라이저 위임의 규칙
- 지정 이니셜라이저는 반드시 부모 클래스의 이니셜라이저를 호출해야 한다.
- 편의 이니셜라이저는 반드시 같은 클래스의 이니셜라이저를 호출해야 한다.
- 편의 이니셜라이저는 결과적으로 지정 이니셜라이저를 호출해야 한다.
궁극적으로 보면
- 지정 이니셜라이저는 항상 부모 클래스의 이니셜라이저를 호출해야 한다.
- 편의 이니셜라이저는 항상 같은 클래스의 이니셜라이저를 호출한다.
2단계 초기화
- 자식 및 부모 클래스의 모든 저장 속성에 초기 값을 지정한다.
- 자식 및 부모 클래스의 저장 속성 값을 변경한다. 이 시점부터 메소드 및 연산 속성을 사용하여 초기화를 진행한다.
- 부모 클래스를 호출하기 전 자식 클래스의 프로퍼티를 초기화 하여야 한다.
- 부모 클래스에 있는 프로퍼티에 따로 값을 할당하기 위해선 부모 클래스를 먼저 호출해야 한다.
- 단, 자식 클래스의 프로퍼티가 초기화 된 경우 자식 클래스의 프로퍼티에 값을 할당하는 구문은 뒤에 동작하여도 된다.
이니셜라이저 상속
- 스위프트는 기본적으로 자식 클래스에서 부모 클래스의 이니셜라이저를 상속하지 않는다.
- 무분별하게 상속돼 복잡해지면서 자식 클래스를 잘못 초기화히는 상황을 막기 위함이다.
- 다만 특정 조건을 만족하면 이니셜라이저를 상속한다.
이니셜라이저 상속하기 위한 조건
- 자식 클래스가 지정 이니셜라이저를 정의하지 않은 경우 지정 이니셜라이저를 상속 받는다.
- 자식 클래스가 부모 클래스의 지정 이니셜라이저를 모두 구현(상속 또는 오버라이드)한 경우 편의 이니셜라이저를 상속 받는다.
필수 이니셜라이저 (Required Initializer)
- 모든 자식 클래스에서 반드시 구현해야 하는 이니셜라이저
- required 키워드를 붙여 사용 가능하고 자식 클래스에서 구현할 때에도 required 키워드를 붙여야 한다.
- required는 오버라이드를 기본으로 포함하고 있다.
클로저를 활용한 이니셜라이저
- 기본 값 설정이 단순히 값을 할당하는 것이 아닌 다소 복잡한 계산을 필요로 한다면 클로저나 함수를 이용해 값을 초기화하는데 이용할 수 있다.
- 클로저가 끝난 뒤에 괄호’()’를 붙여 속성이 클로저 자체가 아닌 연산의 결과를 가지도록 할 수 있다.
- 연산 프로퍼티와 다른 점은 연산 프로퍼티는 변수를 참조할 때마다 호출되지만 클로저를 활용한 이니셜라이저는 한번만 호출되고, 상수가 아닌 변수로 선언할 경우 값을 변경할 수도 있다.
참고 : https://docs.swift.org/swift-book/LanguageGuide/Initialization.html