소소한개발팁
article thumbnail
반응형

Deinitialization 

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

 

How Deinitilization Works 

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

 

deinit {
    // perform the deinitialization
}

 

 

Deinitializers in Action

- Deinitialization의 사용 예시입니다.

 

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
    }
}

 

- Bank 클래스를 하나 선언하고 Bank가 소유한 코인 수coinsInBank 코인을 배포하는 distribute 메서드와 코인을 받는 receive 메서드를 선언했습니다.

 

- distribute메서드에서는

 

- 만약 은행에 남은 코인이 0이라면 요청한 코인 대신 0을 반환합니다.

 

- receive메서드는 코인을 받아 은행에 추가하는 메서드입니다.

 

- 사용자는 게임을 하는데 처음에 일정 코인을 은행으로부터 받고 시작하고, 게임에서 이길 때마다 은행에서 코인을 받아 사용자의 지갑에 저장합니다.

 

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)
    }
}

 

- 게임이 끝나면 은행에서 받았던 돈을 다시 은행에 돌 여주기 위해 위 코드에서 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"

print("There are now \(Bank.coinsInBank) coins left in the bank")
// Prints "There are now 9900 coins left in the bank"

playerOne!.win(coins: 2_000)

print("PlayerOne won 2000 coins & now has \(playerOne!.coinsInPurse) coins")
// Prints "PlayerOne won 2000 coins & now has 2100 coins"

print("The bank now only has \(Bank.coinsInBank) coins left")
// Prints "The bank now only has 7900 coins left"

playerOne = nil

print("PlayerOne has left the game")
// Prints "PlayerOne has left the game"

print("The bank now has \(Bank.coinsInBank) coins")
// Prints "The bank now has 10000 coins"

 

- playerOne = nil이라는 것은 더 이상 이 인스턴스를 사용하지 않는다는 것입니다. 그래서 앞의 deinit 이 실행돼 그곳에 선언한 지갑에 있는 돈을 은행에 반납하는 코드가 실행돼 은행은 다시 처음에 갖고 있던 10000 코인을 갖게 됩니다.

 

 

내용은 https://docs.swift.org/swift-book/LanguageGuide/TheBasics.html를 보면서 작성하였고 원문으로 작성된 내용을 옮기다 보니 이상한 부분이 있을 수 있습니다. 자세한 내용은 위의 링크를 확인해주시기 바랍니다.

반응형
profile

소소한개발팁

@개발자 뱅

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!