Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- SWIFT
- tableView
- collectionview
- Human interface guide
- 리팩토링
- MVVM
- 리펙토링
- rxswift
- HIG
- ribs
- 클린 코드
- map
- 리펙터링
- ios
- uitableview
- swift documentation
- UICollectionView
- swiftUI
- Clean Code
- RxCocoa
- Refactoring
- 애니메이션
- uiscrollview
- Protocol
- clean architecture
- UITextView
- combine
- Observable
- 스위프트
- Xcode
Archives
- Today
- Total
김종권의 iOS 앱 개발 알아가기
[iOS - swift] Designated init, Convenience init, 초기화의 핵심, 초기화 상속 본문
iOS 기본 (swift)
[iOS - swift] Designated init, Convenience init, 초기화의 핵심, 초기화 상속
jake-kim 2020. 11. 26. 01:08초기화의 핵심
- 초기화 종류는 2가지 (Designated, convenience)
- 초기화의 목적: 모든 멤버 초기화 (1단계) + 상속받은 멤버들 customizing (2단계)
Designated initializer (지정 초기자)
- 클래스의 모든 프로퍼티를 초기화 해야함
- 클래스 타입은 반드시 한 개 이상의 지정 초기자가 필요
init(parameters) {
statements
}
Convenience initializer (편의 초기자)
- 옵셔널
- Convenience init 내부에서 반드시 Designated Init이 호출되어야 함 (self.init())
convenience init(parameters) {
self.init()
statements
}
초기화 규칙 - 모든 멤버가 초기화 되어야 한다는 보장
- Designated init은 반드시 바로 위 super class의 Designated init을 호출해야함
(delegation: sub class에서 super class의 init호출) - Convenience init은 반드시 같은 클래스의 Designated init을 호출해야함 (Designated init은 모든 멤버 초기화가 보장되므로)
(다른 Convenience를 호출하더라도 최종적으로 Designated init 호출해야함)
2단계 초기화 - 상속에서의 초기화 규칙 (two-phase initialization)
컴파일 강제
첫 단계: 자신의 클래스 멤버 모두 초기화
두 번째 단계: super class로 부터 상속받은 멤버들을 super class의 designated init을 호출함으로서 모두 초기화
- super class의 designated init호출 전에 자신의 멤버 먼저 초기화
- super class로 부터 상속받은 멤버를 초기화 할 때, super class의 Designated init을 먼저 호출
(그렇지 않으면 super class의 Designated init으로 인해 다시 값이 덮어씌워질 위험) - Convenience Init도 마찬가지로 Designatred init호출 후 별도의 값 대입 가능
(위와 같은 이유) - 초기화 중에는 instance method와 instance property사용 불가
2단계 초기화의 원리 이해 - 모든 멤버를 먼저 초기화 하고, 이후 customizing 하는 것
1단계 - 등산 (모든 멤버 초기화)
- 클래스의 init호출
- 클래스 인스턴스에 대한 메모리 할당 (단, 아직 초기화 되지 않음)
- sub class의 멤버들 모두 Designaged로 초기화 (단, 상속받은 멤버들은 아직 초기화x)
- 위에서 Designated init은 super class의 Designated init도 호출 (이 때 상속받은 멤버들 초기화)
- Root class까지 연쇄적으로 진행
- Root까지 가게되면 모든 멤버의 초기화 완료
2단계 - 하강 (상속받은 멤버들에 대한 customizing)
- Root class에서 다시 sub class로 한 단계식 차례대로 하강
- sub class로 내려오면서, super class의 Designated init을 호출한 시점으로 복귀
- 해당 단계에서 상속받은 멤버에 대한 customizing이 가능
- 최 하위 sub class까지 하강
- 모든 클래스의 customizing완료
초기화 자동 상속 - 모든 멤버가 초기화 되어야 하므로, 제약이 따름
- 모든 신규 멤버들에 디폴트 값이 있으면 자동 상속 o
- sub class가 Designated init을 하나도 정의하지 않았으면 자동 상속 o
(Designated init이 하나라도 존재하면 super class의 init 전부 자동 상속 x) - super class의 Designated init을 모두 상속 받거나, 작성하면 Convenience Init은 자동 상속
required init
- required 키워드가 init앞에 붙으면, 모든 sub class들이 명시적으로 해당 초기화를 구현
(required를 붙이면 상속의 의미가 이미 있으므로, override키워드는 붙이지 않음)
참고: docs.swift.org/swift-book/LanguageGuide/Initialization.html
'iOS 기본 (swift)' 카테고리의 다른 글
[iOS - swift] class var vs static var (0) | 2020.11.29 |
---|---|
[iOS - swift] run타임에서 디버깅 방법, 콘솔창에서 print (break point, po) (0) | 2020.11.26 |
[iOS - swift] intrinsic content size (0) | 2020.11.21 |
[iOS - swift] UILabel 문자열 길이 줄이는 스타일 (Line break, Truncate) (0) | 2020.11.20 |
[iOS - swift] UILabel 글자 크기 자동 줄이기 (autoshrink, minimum font scale, minimim font size, adjustsFontSizeToFitWidth) (0) | 2020.11.20 |
Comments