Deinitialization

Groot·2022년 8월 24일
0

Swift Language Guide

목록 보기
14/24
post-thumbnail

Deinitialization

  • Deinitializer는 클래스 인스턴스가 할당 해제되기 직전에 호출됩니다.
  • 초기화 프로그램이 init 키워드로 작성되는 방식과 유사하게 deinit 키워드를 사용하여 초기화 해제 프로그램을 작성합니다.
  • Deinitializers는 클래스 유형에서만 사용할 수 있습니다.

📌 How Deinitialization Works

  • Swift는 리소스를 확보하기 위해 더 이상 필요하지 않을 때 인스턴스를 자동으로 할당 해제합니다.
  • Swift는 자동 참조 카운팅(ARC)을 통해 인스턴스의 메모리 관리를 처리합니다.
  • 일반적으로 인스턴스가 할당 해제될 때 수동 정리를 수행할 필요가 없습니다.
  • 그러나 자체 리소스로 작업하는 경우 몇 가지 추가 정리를 직접 수행해야 할 수도 있습니다.
  • 예를 들어 파일을 열고 일부 데이터를 쓰기 위해 사용자 정의 클래스를 생성하는 경우 클래스 인스턴스가 할당 해제되기 전에 파일을 닫아야 할 수 있습니다.
  • 클래스 정의는 클래스당 최대 하나의 초기화 해제자를 가질 수 있습니다. 디이니셜라이저는 매개변수를 사용하지 않으며 괄호 없이 작성됩니다.
    deinit {
        // perform the deinitialization
    }
  • 초기화 해제는 인스턴스 할당 해제가 발생하기 직전에 자동으로 호출됩니다.
  • 직접 deinitializer를 호출할 수 없습니다.
  • 수퍼클래스 초기화 해제자는 하위 클래스에 의해 상속되며 수퍼클래스 초기화 해제자는 하위 클래스 초기화 해제 구현의 끝에서 자동으로 호출됩니다.
  • 서브클래스가 자체적인 초기화를 제공하지 않더라도 슈퍼클래스의 초기화 해제자는 항상 호출됩니다.
  • 인스턴스는 초기화 해제가 호출될 때까지 할당이 해제되지 않기 때문에, deinitializer는 호출된 인스턴스의 모든 속성에 액세스할 수 있으며 해당 속성에 따라 동작을 수정할 수 있습니다(예: 닫아야 하는 파일 이름 조회).

📌 Deinitializers in Action

  • 다음은 작동 중인 초기화 해제의 예입니다.
  • 이 예제에서는 간단한 게임에 대해 Bank와 Player라는 두 가지 새로운 유형을 정의합니다.
  • Bank 클래스는 10,000개 이상의 코인이 유통될 수 없는 구성 통화를 관리합니다.
  • 게임에는 Bank가 하나만 있을 수 있으므로 Bank는 현재 상태를 저장하고 관리하기 위한 유형 속성과 메서드가 있는 클래스로 구현됩니다.
    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
        }
    }
  • 은행은 CoinInBank 속성을 사용하여 보유하고 있는 현재 코인 수를 추적합니다.
  • 또한 코인의 배포 및 수집을 처리하기 위해 distribute(coins:) 및 receive(coins:)의 두 가지 방법을 제공합니다.
  • distribution(coins:) 메소드는 분배하기 전에 은행에 충분한 코인이 있는지 확인합니다.
  • 코인이 충분하지 않은 경우 Bank는 요청된 수보다 작은 수를 반환합니다(은행에 코인이 남아 있지 않으면 0을 반환).
  • 제공된 실제 코인 수를 나타내는 정수 값을 반환합니다.
  • receive(coins:) 메소드는 단순히 수신된 코인 수를 은행의 코인 저장소에 다시 추가합니다.
  • Player 클래스는 게임의 플레이어를 설명합니다. 각 플레이어는 언제든지 지갑에 일정 수의 동전을 보관하고 있습니다.
  • 이것은 플레이어의 coinInPurse 속성으로 표시됩니다.
    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)
        }
    }
  • 각 Player 인스턴스는 초기화 중에 은행에서 지정된 수의 코인의 시작 허용량으로 초기화되지만 사용 가능한 코인이 충분하지 않은 경우 Player 인스턴스는 해당 수보다 적게 받을 수 있습니다.
  • Player 클래스는 은행에서 일정 수의 동전을 검색하여 플레이어의 지갑에 추가하는 win(coins:) 메서드를 정의합니다.
  • Player 클래스는 또한 Player 인스턴스가 할당 해제되기 직전에 호출되는 초기화 해제를 구현합니다. 여기서 deinitializer는 단순히 플레이어의 모든 코인을 은행에 반환합니다.
    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"
  • 사용 가능한 경우 100개의 코인을 요청하는 새 Player 인스턴스가 생성됩니다.
  • 이 Player 인스턴스는 playerOne이라는 선택적 Player 변수에 저장됩니다.
  • 플레이어는 언제든지 게임을 떠날 수 있으므로 선택적 변수가 여기에 사용됩니다.
  • 선택 사항을 사용하면 현재 게임에 플레이어가 있는지 여부를 추적할 수 있습니다.
  • playerOne은 선택 사항이기 때문에 기본 동전 수를 인쇄하기 위해 coinInPurse 속성에 액세스할 때와 win(coins:) 메서드가 호출될 때마다 느낌표(!)가 표시됩니다.
    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"
  • 여기에서 플레이어는 2,000코인을 획득했습니다. 플레이어의 지갑에는 이제 2,100개의 동전이 있고 은행에는 7,900개의 동전만 남아 있습니다.
    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로 설정하여 표시됩니다.
  • 이 시점에서 Player 인스턴스에 대한 playerOne 변수의 참조가 깨집니다.
  • 다른 속성이나 변수는 여전히 Player 인스턴스를 참조하지 않으므로 메모리를 확보하기 위해 할당이 해제됩니다.
  • 이러한 일이 발생하기 직전에 해당 초기화 해제 프로그램이 자동으로 호출되고 해당 코인이 은행으로 반환됩니다.
profile
I Am Groot

0개의 댓글