스위프트의 인스턴스의 생성과 소멸

개요


swift에서도 cpp의 생성자 소멸자 같은 기능이 있다.

initializer, deinitializer라고 부른다.




인스턴스 생성


인스턴스를 사용하기 위해 저장 프로퍼티의 초깃값을 설정한다. 그러므로 이니셜라이저는 반환값이 없다.

init키워드를 사용하면 이니셜라이저 메서드임을 표현한다.

이니셜라이저를 통해 초깃값을 할당하면 프로퍼티 감시자 메서드가 호출되지 않는다.

당연히 매개변수를 받을 수 있다.

상수 프로퍼티는 초기화하는 과정에서만 값을 할당할 수 있다.

그러므로 자식클래스는 부모클래스의 상수값을 할당할 수 없다.

멤버와이즈 이니셜라이저라는 것으로 일일이 구현안해주고 인스턴스 생성할 때 매개변수로 넣으면 초기화 시켜주는 게 있다.

이 이니셜라이저는 구조체만 있고 클래스는 없다.

구조체와 열거형은 self.init()을 통해 기본 생성자를 사용할 수 있다.




지정 생성자


지정 생성자는 클래스의 생성자중 가장 높은 우선순위를 가진다.

모든 클래스는 상위클래스로부터 지정 생성자를 상속하는 경우를 제외하고 반드시 하나 이상의 지정생성자를 구현해야한다.

그냥 일반적으로 사용하는 생성자는 지정 생성자이다.




간편 생성자


다양한 파라메터를 통해 인스턴스를 생성할 수 있도록 convenience Initializer를 구현할 수 있다.




실패 가능한 이니셜라이저


이니셜라이저의 매개변수로 잘못된 값이 전달되었다면 인스턴스 초기화에 실패할 수 있다. 이럴 경우를 대비한 이니셜라이저가 있다.

이것은 클래스 구조체 열거형등에 모두 정의할 수 있다. 실패한 이니셜라이저는 nil을 반환해주므로 반환 타입이 옵셔널로 지정된다. 그러기에 init?키워드를 사용한다.

1
2
3
4
5
6
7
8
9
10
11
class Person {
  let name: String
  var age: Int?
  
  init?(name: String) {
    if name.isEmpty {
      return nil
    }
  }
  ...
}




인스턴스 소멸


오직 클래스만 디이니셜라이저를 만들 수 있다.

메모리에서 해제되기 전 클래스 인스턴스에 대해서 작업할 수 있다. deinit키워드를 이용하여 만들면 소멸되기전 자동으로 호출된다.

1
2
3
4
5
class ExClass {
  deinit {
    print("ho")
  }
}

흔히 파일을 열어서 사용하고 클래스가 더이상 필요없을 때 파일을 닫는 역할로 사용한다.