본문 바로가기

Swift Language

Swift Language - 14 - 초기화 해지 (Deinitialization)

디이니셜라이저는 초기자(Initializer)와 반대로 클래스 인스턴스가 소멸되기 직전에 호출됩니다. 초기자는 선언 키워드로 init를 사용하는데 디이니셜라이저는 선언을 위해 deinit키워드를 사용합니다. 디이니셜라이저는 오직 클래스 타입에서만 사용 가능합니다.

 

초기화 해지의 동작 (How Deinitilization Works)

/* 일반적으로 Swift가 자원의 해제를 자동으로 알아서 해주는데, 
열었던 파일을 사용이 끝나고 닫는 것 같이 사용자가 자원 해지를 위해 수동으로 작업 해야하는 경우도 있습니다. 
이럴 때 사용하는 것이 디이니셜라이저입니다.디이니셜라이저는 클래스당 오직 하나만 선언할 수 있고 
파라미터를 받을 수 없습니다. 디이니셜라이저의 기본적인 선언 형태는 다음과 같습니다. */
deinit {
    // perform the deinitialization
}

 

디이니셜라이저의 사용 (Deinitializers in Action)

class Bank {
    static var coinsInBank = 10_000
    static func distribute(coins numberOfCoinsRequested: Int) -> Int {
        let numberOfCoinsToVend = min(numberOfCoinsRequested, coinsInBank)
        coinsInBank -= numberOfCoinsToVend
        return numberOfCoinsToVend
    }
    static func receive(coins: Int) {
        coinsInBank += coins
    }
}


class Player {
    var coinsInPurse: Int
    init(coins: Int) {
        coinsInPurse = Bank.distribute(coins: coins)
    }
    func win(coins: Int) {
        coinsInPurse += Bank.distribute(coins: coins)
    }
    deinit {
        Bank.receive(coins: coinsInPurse)
    }
}


var playerOne: Player? = Player(coins: 100)
print("A new player has joined the game with \(playerOne!.coinsInPurse) coins")
// Prints "A new player has joined the game with 100 coins"
// 사용자는 100 코인을 갖고 시작합니다.
print("There are now \(Bank.coinsInBank) coins left in the bank")
// Prints "There are now 9900 coins left in the bank"
// 현 시점에 은행은 9900의 코인을 소유하고 있습니다.

 

 

 

출처 https://jusung.gitbook.io/the-swift-language-guide/language-guide/15-deinitialization