티스토리 뷰

Swift

[Swift] 인스턴스

Hani_Levenshtein 2021. 1. 16. 19:44

객체지향 프로그래밍의 근원인 객체를 다루기 위해 인스턴스가 생성되어야 합니다.

인스턴스의 생성은 곧 메모리를 잡아먹기 때문에 더 이상 필요 없는 인스턴스를 메모리에서 해제하기도 합니다.

이번 포스팅에서는 인스턴스의 생성과 소멸을 관리하는 initializer와 deinitializer에 관하여 알아볼 것입니다.


이니셜라이저(initializer)

 

struct C {
    var a: String = "abc" // 기본값을 미리 넣어두면 프로퍼티 생성 시 초기화
    var b: Double // 기본값이 없기 때문에 이니셜라이저를 통해 초기화
    var c: Int!
    var d: Int?
    init() {
        b = 32.0
    }
}
var f = C()
//f.a = abc
//f.b = 32.0

initializer는 인스턴스를 생성할 때 초기값을 할당해줄 수 있는 메서드입니다.

클래스, 구조체 그리고 열거형에서 사용이 가능합니다.

만약 생성 시 초기값을 설정하고 싶지 않다면 옵셔널을 사용할 수 있습니다.

단, 암시적 추출 옵셔널 타입 변수는 초기값은 할당하지 않더라도 호출하기 전에는 반드시 값을 할당해줘야 합니다.

 

실패 가능한 이니셜라이저

struct Animal {
    let species: String
    init?(species: String) {
        if species.isEmpty { return nil }
        self.species = species
    }
}
let someCreature = Animal(species: "Giraffe") // someCreature.species=Giraffe
let anonymousCreature = Animal(species: "") // anonymousCreature=nil

initializer매개변수로 전달되는 초기값이 잘못된 경우 인스턴스 생성에 실패할 수 있습니다.

인스턴스 생성에 실패하면 nil을 반환하며 이러한 이유로 반환 타입은 옵셔널 타입입니다.

일반 initializer와는 다르게 init에 옵셔널을 붙여 선언합니다.


디이니셜라이저(deinitializer)

class Book(){
    func open(){}
    func close(){}
    deinit{
    self.close()
    }
}
var newbook=Book()

...

newbook = nil

deinitializer는 클래스 인스턴스가 해제되기 직전에 호출됩니다.

더 이상 필요하지 않은 인스턴스를 할당 해제하여 메모리를 확보할 수 있습니다.

initializer와는 다르게 클래스에서만 사용가능합니다.

 

nil을 통해 할당을 해제하면 할당 해제 직전에 deinitializer에 있는 메서드들이 실행됩니다.

따라서 직접 deinit을 호출하지 않아도 인스턴스의 역할을 마무리 할 수 있습니다.

'Swift' 카테고리의 다른 글

[Swift] Color Literal / Custom Color  (0) 2021.03.15
[Swift] 익스텐션  (0) 2021.01.17
[Swift] 프로퍼티의 종류  (0) 2021.01.13
[Swift] 메서드  (0) 2021.01.13
[Swift] 옵셔널  (0) 2021.01.12
댓글