[Swift5] Deinitialization

Junyoung Park·2022년 3월 24일
0

Swift5 Docs

목록 보기
31/37
post-thumbnail
  • 다음은 Swift 5.6 Doc의 Deinitialization 공부 내용을 정리했음을 밝힙니다.

Deinitialization

디이니셜라이저는 클래스 인스턴스가 해제되기 직전에 호출된다. 디이니셜라이저를 deinit 키워드로 작성할 수 있으며, 클래스 타입에만 사용된다.

디니이셜라이제이션 작동 방법

인스턴스가 더 이상 필요하지 않으면 리소스 여유분을 위해 자동으로 인스턴스를 해제한다. 즉 자동 참조 카운팅을 통해 인스턴스 메모리 관리를 도와준다. 그렇기 때문에 따로 메모리 할당을 위한 코드를 작성할 필요가 없다. 하지만 리소스로 작업할 때에는 직접 인스턴스에 할당된 메모리를 해제할 필요가 있다.

클래스는 최대 한 개의 디니이셜라이저를 가진다. 괄호나 파라미터 없이 사용된다.

deinit {
    // perform the 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
    }
}

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"
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"
Here, the player has won 2,000 coins. The player’s purse now contains 2,100 coins, and the bank has only 7,900 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"

Player 클래스의 디이니셜라이저는 Bank 클래스의 타입 메소드 receive를 통해 메모리 해제 이전에 가지고 있는 동전을 반납하는 역할이다.

Player가 게임을 떠났다는 점을 표현하기 위해 옵셔널 인스턴스로 표현되며, 만일 게임을 꺼난다면 널 값을 통해 표현할 수 있다. 널 값을 할당할 때 자동으로 PlayerOne 메모리가 해제되고 있고, 이 시점에 디이니셜라이저가 호출된다는 것을 확인 가능.

profile
JUST DO IT

0개의 댓글