지정 생성자 (Initializer), 편의 생성자 (Convenience Initializer)


생성자는 보통 다른 언어에서도 많이 보던 그 녀석이지만, 편의 생성자는 이번에 처음 접해보았다.


결과적으로, 지정 생성자를 보조하는 역할로서, 지정 생성자를 뿌리로 해서 재사용에서 용이한 이점을 살리려고 사용하는 것 같다.


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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
class CPerson
{
    var name : String;
    
    init (name : String)
    {
        NSLog("===== CPerson Init =====");
        
        self.name = name;
    }
}
 
class CStudent : CPerson
{
    var level : Int;
    var desc : String?;
    
    // 지정 생성자
    init (name : String, level : Int)
    {
        NSLog("===== CStudent Init =====");
        
        self.level = level; // 3. 자식의 프로퍼티 먼저 초기화되어야 한다.
        
        super.init(name: name); // 4. 그 뒤 부모 생성자 호출.
    }
    
    // 편의 생성자
    convenience init (name : String, level : Int, desc : String?)
    {
        NSLog("===== CStudent convenience Init =====");
 
        self.init(name: name, level: level);    // 1. 편의 생성자는 먼저 지정 생성자를 호출 후 나머지 프로퍼티를 초기화한다. 자신의 클래스 내의 생성자를 다시 부르는 것이 가능하다. 생성자의 재사용.
 
        self.desc = desc;   // 2. 지정 생성자 호출 후 파라미터 초기화.
    }
    
    // 이렇게도 가능은 하지만..
    init (name : String, level : Int, desc : String?)
    {
        NSLog("===== CStudent Init (name:level:desc:) =====");
 
        // 가능은 하지만 아무래도 비효율적이다. 만약 CStudent의 생성자 갯수가 여러개가 필요하다면 매우 비효율적일 것.
        self.desc = desc;
        self.level = level;
        super.init(name: name);
 
        // Designated initializer for 'CStudent' cannot delegate (with 'self.init'); did you mean this to be a convenience initializer?
        // 이런 식으로 init을 자신의 것을 다시 부를 수 없어서 사용하는 모양이다.
//        self.desc = desc;
//        self.init(name: name, level: level);
        
        
    }
}
 
cs


자식 클래스  CStudent는 Person을 상속했으며,


init (name:level:) 을 지정 생성자로, init (name:level:desc:) 를 편의 생성자로 한다.


지정 생성자를 호출할 시, 지정 생성자를 먼저 호출 후 남은 프로퍼티를 초기화한다.


init을 오버로드하는 방법으로도 사용할 수 있지만, 아무래도 편의 생성자는 지정 생성자를 재사용 가능하기 때문에


코드 재사용 측면에서 유리하니 되도록이면 편의 생성자를 활용하는 방법이 좋을 것 같다.


부모 클래스의 지정 생성자는 편의 생성자와 반대로, 자식의 프로퍼티 초기화 후 부모의 지정 생성자를 콜한다.


1
2
3
4
5
// convenience Init
        var tmpStudent : CStudent = CStudent.init(name: "ETERIS", level: 17, desc: "DESC");
        NSLog("%@", tmpStudent.name);
        NSLog("%d", tmpStudent.level);
        NSLog("%@", tmpStudent.desc ?? "DESC NONE");
cs


실행코드는 위와 같다. 편의 생성자로 CStudent 클래스를 초기화했다.




결과값.


생성자들의 실행 순서를 잘 파악해두자.


'Developer > Swift' 카테고리의 다른 글

Swift 각종 용어 정리 (지속 업데이트 필요)  (0) 2018.04.20
Protocol  (0) 2018.04.20
지정 생성자 (Initializer), 편의 생성자 (Convenience Initializer)  (0) 2018.04.13
서브스크립트 (subscript)  (0) 2018.04.11
클로저 (Closure)  (0) 2018.04.09
return func  (0) 2018.04.09

이 글을 공유하기


댓글(0)

Designed by CMSFactory.NET