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
 - 애니메이션
 - RxCocoa
 - 스위프트
 - uiscrollview
 - uitableview
 - HIG
 - 리펙토링
 - UITextView
 - ribs
 - swiftUI
 - MVVM
 - map
 - collectionview
 - swift documentation
 - UICollectionView
 - Human interface guide
 - scrollview
 - Xcode
 - Observable
 - ios
 - rxswift
 - 클린 코드
 - 리팩토링
 - Refactoring
 - tableView
 - Clean Code
 - Protocol
 - clean architecture
 - combine
 
													Archives
													
											
												
												- Today
 
- Total
 
김종권의 iOS 앱 개발 알아가기
[swift] 13. 초기화(init, convenience init, required init, override init) 본문
			swift 5 문법
			
		[swift] 13. 초기화(init, convenience init, required init, override init)
jake-kim 2020. 4. 17. 21:14let b = Boo()
원래의 의미는 "let b = Boo.init()"
1. init의 존재 이유
- 모든 저장 프로퍼티들은 초기화 되어야 함, init키워드는 이것을 도와줌
| 
 1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
 | 
 class Test{ 
    var a:Int! // nil로 초기화 
    var b:Int? // nil로 초기화 
    var c: Int // init으로 초기화 
    var d: Int // error 
    init(tmp: Int){ 
        self.c = tmp 
    } 
} 
 | 
(d변수가 초기화 되지 않아서 error)
2. 초기화의 종류
1) 초기화 메소드의 델리게이션: super.init()
(연쇄적인 초기화)
| 
 1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
 | 
 class A{ 
    var a: Int 
    init(value: Int) { 
        self.a = value 
    } 
} 
class B: A{ 
    init(value1: Int, value2: Int) { 
    } 
} 
class C: B { 
    init(value1: Int, value2: Int, value3: Int) { 
    } 
} 
 | 
2) 지정 초기화 메소드 (Designated Initializer)
- 서브 클래싱시 꼭 초기화 해줘야 하는 메소드 : init(...)으로 작성
* required init은 서브클래스에서 super.init이 아닌, 직접 구현해야 하는 초기화메소드
| 
 1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 
13 
14 
15 
16 
17 
 | 
 class A{ 
    var a: Int 
    init(value: Int) { 
        self.a = value 
    } 
    required init (val1: Int, val2: Int, val3: String){ 
        self.a = val1 
    } 
} 
class B: A{ 
    required init(val1: Int, val2: Int, val3: String) { 
    } 
} 
 | 
3) 편의 초기화 메소드 (Convenience Initializer)
- convenience init(...) : 현재 정의되어 있는 초기화메소드를 불러서 추가적인 내용을 덫 붙이는 것
※ convenience가 아닌 init키워드는 블록안에 self.init과 같이 다른 초기화 메소드를 부를 수 없음
| 
 1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 
13 
 | 
 class A{ 
    var a: Int 
    var name: String! 
    init(val1: Int, val2: String) { 
        self.a = val1 
        self.name = val2 
    } 
    convenience init(newVal: Int) { 
        self.init(val1: newVal, val2: "imustang") 
    } 
} 
 | 
3. init의 오버로딩과 오버라이딩
서브클래싱시, 수퍼 클래스에서 init키워드로 작성된 것은 꼭 super로 초기화 필요
1) 오버로딩 : 같은 이름의 메소드, 다른 매개변수 or 다른 리턴 타입
(안할 시 a변수가 초기화 안된 상태로 남아있음)
class A{
    var a: Int
    
    init(inValue: Int) {
        self.a = inValue
    }
}
class B: A{
    var b: Int
    
    init(inValue: Int, inValue2: Int) {
        self.b = inValue2
        super.init(inValue: inValue)
        
    }
}
2) 오버라이딩 : 메소드 이름, 매개변수, 리턴타입 모두 같아야함
서브클래싱시, 수퍼클래스와 같은 초기화 이름으로 할 땐 override init으로 선언
class A{
    var a: Int
    
    init(inValue: Int) {
        self.a = inValue
    }
}
class B: A{
    var b: Int
    
    override init(inValue: Int) {
        self.b = inValue
        super.init(inValue: inValue)
    }
}
'swift 5 문법' 카테고리의 다른 글
| [swift] 15. 객체지향 vs 함수형 (0) | 2020.04.20 | 
|---|---|
| [swift] 14. 접근 제한자(private, fileprivate, internal, public, open) (0) | 2020.04.18 | 
| [swift] 12. 예외 처리 (throws, throw, do - try - catch) (3) | 2020.03.29 | 
| [swift] 11. 프로토콜 (protocol) (0) | 2020.03.29 | 
| [swift] 10. 열거형과 익스텐션 (0) | 2020.03.29 |