티스토리 뷰

[인스턴스 생성]


- 초기화 과정 시 새로운 인스턴스를 사용할 준비를 하기 위하여 저장 프로퍼티의 초기값을 설정하는 등의 일을 함

 : 이니셜라이저(이하 생성자)를 정의하여 초기화 과정을 직접 구현할 수 있음

- 생성자는 새로운 인스턴스를 생성하는 특별한 메서드

- init 키워드를 사용

- 클래스, 구조체, 열거형의 구현부 또는 해당 타입의 익스텐션 구현부에 위치함

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
class Class{
    var name: String
    init() {
        name = "Swift"
    }
    init(name: String) {
        self.name = name
    }
}
 
struct Struct{
    var name: String
    init() {
        name = "Swift"
    }
}
 
enum Enum{
    case name
    init(){
        self = .name
        //열거형은 초기화할 때 반드시 case 중 하나가 되어야 함
    }
}
 
let a = Class()
let b = Class(name: "ObjC")
print(a.name)   //Swift
print(b.name)   //ObjC
 
cs


- 구조체와 클래스의 인스턴스는 처음 생성 시 옵셔널 저장 프로퍼티를 제외한 모든 저장 프로퍼티에 적절한 초기값을 할당해야 함

 : 초기화 과정에서 값이 할당되지 않은 옵셔널 저장 프로퍼티에는 nil이 할당됨

- 프로퍼티 정의 시 기본값을 할당하면 생성자에서 따로 초기값을 할당하지 않아도 됨


- 구조체의 경우 생성자가 없으면 자동으로 멤버와이즈 생성자가 만들어짐

 : 프로퍼티의 이름으로 매개변수를 가짐

 : 사용자 정의 생성자를 구현하였다면 멤버와이즈 생성자는 만들어지지 않음

- 클래스는 그렇지 않으므로 생성자를 활용하고 싶으면 직접 구현해 주어야 함



[초기화 위임]


- 구조체, 열거형에서 생성자가 다른 생성자에게 일부 초기화를 위임하는 초기화 위임을 구현할 수 있음

- 코드 중복을 피할 수 있음

- 최소 두 개 이상의 사용자 정의 생성자를 정의해야 함

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
enum Student{
    case elementary, middle, high
    case none
    init(){
        self = .none
    }
    init(koreanAge: Int){
        switch(koreanAge){
        case 8...13:
            self = .elementary
        case 14...16:
            self = .middle
        case 17...19:
            self = .high
        default:
            self = .none
        }
    }
    init(bornAt: Int, currentYear: Int){
        self.init(koreanAge: currentYear - bornAt + 1)
    }
    //초기화 위임 : 생성자에서 다른 생성자를 호출
}
 
var school: Student = Student(koreanAge: 18)        //high
school = Student(bornAt: 1998, currentYear: 2017)   //none
cs




[실패 가능한 이니셜라이저]


- init? 키워드를 사용하여 초기화 실패 시 nil을 반환하도록 함

 : 실제로 생성자가 값을 반환하는 것은 아님

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
enum Student{
    case elementary, middle, high
    case none
    init?(koreanAge: Int){
        switch(koreanAge){
        case 8...13:
            self = .elementary
        case 14...16:
            self = .middle
        case 17...19:
            self = .high
        default:
            return nil
        }
    }
    init?(bornAt: Int, currentYear: Int){
        self.init(koreanAge: currentYear - bornAt + 1)
    }
    //초기화 위임 : 생성자에서 다른 생성자를 호출
}
 
if let school = Student(koreanAge: 43){
    print(school)   //실행 안됨
}
if let school = Student(koreanAge: 17){
    print(school)   //high
}
cs



1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Class{
    var integers: [Int= {
        var array = [Int]()
        for i in 0...15{
            array.append(i)
        }
        return array
    }()
    //클로저 실행을 위해 소괄호 쌍을 뒤에 붙임
    //소괄호가 없으면 클로저 그 자체를 integers에 할당하는 것 -> integers는 Int형 배열을 반환하는 함수가 됨
}
let a = Class()
a.integers  //0, 1, ..., 14, 15
 
cs


위의 코드는 클로저를 활용하여 프로퍼티의 기본값을 할당하는 것



[인스턴스 소멸]


- 클래스의 인스턴스는 디이니셜라이저(이하 소멸자)를 구현 가능함

deinit 키워드 사용

- 단 하나의 소멸자만 구현할 수 있음

- iOS에서 뷰의 생성/소멸을 확인하기 위해 사용할 수 있는 것 같음

'Swift > 야곰의 스위프트' 카테고리의 다른 글

13장 클로저  (0) 2018.02.12
12장 접근제어  (0) 2018.02.05
10장 프로퍼티와 메서드  (0) 2018.02.03
9장 구조체와 클래스  (0) 2018.02.03
8장 옵셔널  (0) 2018.02.03
댓글
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2025/02   »
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
글 보관함