관리 메뉴

김종권의 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:14

let 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) {
        super.init(value: val1)
    }
}
 
 

 

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)
    }
}
 

 

Comments