본문으로 바로가기

필수생성자

- 부모클래스에서 생성자에 required를 붙이면 자식클래스에서 반드시 해당 생성자를 구현해야한다

- 클래스에서만 사용가능

class AClass { // 부모클래스
    
    required init() { // 필수생성자
        print("필수구현")
    }
    
}

class BClass: AClass {
    
    required init() { // 자식클래스에서 반드시 구현(재정의)
        print("필수구현생성자재정의")
        super.init()
    }

}

let ac = AClass()
let bc = BClass()
/*
 콘솔:
 필수구현
 필수구현생성자재정의
 필수구현
 */

실패가능생성자

- 인스턴스 실패 가능성을 가진 생성자

- 생성 실패시 nil 리턴

- 생성자에 ?를 붙여서 init?(...)으로 정의

- 오버로딩이 불가능 (해당이름을 가진 유일한 생성자여야함)

- 인스턴스의 타입은 옵셔널임

class AClass { // 부모클래스
    
    var str: String
    
    init?(str: String) {
        if str.isEmpty {    // str이 빈값이면
            return nil      // return nil
        } else {            // 빈값이 아니면
            self.str = str  // 초기화
        }
    }
}

// nil 가능성이 있기때문에 옵셔널타입이다
let ac: AClass? = AClass(str: "")       // nil
let ac2: AClass? = AClass(str: "Hello")
ac2?.str                                // "Hello"

소멸자

- 인스턴스가 메모리에서 제거되기 직전 자동으로 호출되는 메서드부분

- 클래스에는 최대 한개의 소멸자가 존재

- 클래스에만 존재

- 파라미터따윈 없다...

class AClass { // 부모클래스
    
    var str: String
    
    init?(str: String) {
        if str.isEmpty {
            return nil
        } else {
            self.str = str
        }
    }
    
    deinit {
        print("객체의 소멸")
    }
}

var ac2: AClass? = AClass(str: "Hello")
ac2 = nil
/*
 콘솔:
 객체의 소멸
 */