Potato
μ•ˆλ…•ν•˜μ„Έμš”, κ°μž‘λ‹ˆλ‹€?πŸ₯” ^___^ 😺 github λ°”λ‘œκ°€κΈ° πŸ‘‰πŸ»

Swift/Swift Documents

[Swift] 곡식 λ¬Έμ„œ 정리 (15) - Deinitialization (μ†Œλ©Έμž, λ””μ΄λ‹ˆμ…œλΌμ΄μ €, deinit)

감자 πŸ₯” 2022. 3. 3. 16:35
λ°˜μ‘ν˜•

μ•ˆλ…•ν•˜μ„Έμš”, κ°μžμž…λ‹ˆλ‹€. μ§€λ‚œλ²ˆ 4일간 κ³΅λΆ€ν–ˆλ˜ μƒμ„±μžμ— μ΄μ–΄μ„œ μ†Œλ©Έμžμ— λŒ€ν•΄μ„œ κ³΅λΆ€ν•œ λ‚΄μš©μ„ μ˜¬λ €λ΄…λ‹ˆλ‹€. κ³΅μ‹λ¬Έμ„œ.. κΈΈμ–΄μ„œ μ–΄λ €μ›Œγ…“μ–΄μ–΄μ–΄

Swift Document chap.15 Deinitialization λ°”λ‘œκ°€κΈ°

 

Deinitialization — The Swift Programming Language (Swift 5.6)

Deinitialization A deinitializer is called immediately before a class instance is deallocated. You write deinitializers with the deinit keyword, similar to how initializers are written with the init keyword. Deinitializers are only available on class types

docs.swift.org

 


Deinitialization (μ†Œλ©Έμž)

λ””μ΄λ‹ˆμ…œλΌμ΄μ €λŠ” μƒμ„±μž(Initializer)μ™€λŠ” λ°˜λŒ€λ‘œ 클래슀 μΈμŠ€ν„΄μŠ€κ°€ μ†Œλ©Έλ˜κΈ° 직전에 ν˜ΈμΆœλœλ‹€. μƒμ„±μžλŠ” μ„ μ–Έ ν‚€μ›Œλ“œλ‘œ init을 μ‚¬μš©ν•˜λŠ”λ° λ””μ΄λ‹ˆμ…œλΌμ΄μ¦ˆλŠ” 선언을 μœ„ν•΄ deinit을 μ‚¬μš©ν•œλ‹€. λ””μ΄λ‹ˆμ…œλΌμ΄μ €λŠ” 였직 클래슀 νƒ€μž…μ—μ„œλ§Œ μ‚¬μš© κ°€λŠ₯ν•˜λ‹€.

 

How Deinitialization Works

일반적으둜 Swiftκ°€ μžμ›μ˜ ν•΄μ œλ₯Ό μžλ™μœΌλ‘œ μ•Œμ•„μ„œ ν•΄μ£ΌλŠ”λ°, μ—΄μ—ˆλ˜ νŒŒμΌμ„ μ‚¬μš©μ΄ λλ‚˜κ³  λ‹«λŠ”κ²ƒ 같이 μ‚¬μš©μžκ°€ μžμ› 해지λ₯Ό μœ„ν•΄ μˆ˜λ™μœΌλ‘œ ν•΄μ•Όν•˜λŠ” κ²½μš°λ„ μžˆλ‹€. 이럴 λ•Œ μ‚¬μš©ν•˜λŠ” 것이 λ””μ΄λ‹ˆμ…œλΌμ΄μ €μ΄λ‹€. λ””μ΄λ‹ˆμ…œλΌμ΄μ €λŠ” 클래슀 λ‹Ή 였직 ν•˜λ‚˜λ§Œ μ„ μ–Έν•  수 있고, νŒŒλΌλ―Έν„°λ₯Ό 받을 수 μžˆλ‹€.

λ””μ΄λ‹ˆμ…œλΌμ΄μ €μ˜ 기본적인 μ„ μ–Έμ˜ ν˜•νƒœλŠ” μ•„λž˜μ™€ κ°™λ‹€.

deinit {
    // perform the deinitialization
}

λ””μ΄λ‹ˆμ…œλΌμ΄μ €λŠ” μžλ™μœΌλ‘œ 호좜되고, μˆ˜λ™μœΌλ‘œ ν˜ΈμΆœν•  수 μ—†λ‹€. superclass의 λ””μ΄λ‹ˆμ…œλΌμ΄μ €λŠ” subclass μ—μ„œ λ””μ΄λ‹ˆμ…œλΌμ΄μ €λ₯Ό μ„ μ–Έν•˜μ§€ μ•Šμ•„λ„ μžλ™μœΌλ‘œ ν˜ΈμΆœλœλ‹€.

 

Deinitializer 의 μ‚¬μš©

λ””μ΄λ‹ˆμ…œλΌμ΄μ €μ˜ λ™μž‘μ„ 확인해보기 μœ„ν•΄ 예제λ₯Ό λ§Œλ“€μ–΄λ³΄μž.

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
    }
}
  • 은행 클래슀λ₯Ό ν•˜λ‚˜ μ„ μ–Έ κ·Έ 속에
    • 은행이 μ†Œμœ ν•œ μ½”μΈμˆ˜ coinsInBank
    • 코인을 λ°°ν¬ν•˜λŠ” distribute λ©”μ„œλ“œ
      • ν˜„μž¬ 은행에 남은 μ½”μΈμˆ˜λ₯Ό 확인해 μš”μ²­ν•œ μ½”μΈμˆ˜μ™€ 비ꡐ해 더 μž‘μ€ 것을 λ°˜ν™˜ν•œλ‹€. λ§Œμ•½ 은행에 남은 코인이 0이라면, μš”μ²­ν•œ 코인 λŒ€μ‹  0을 λ°˜ν™˜ν•œλ‹€.
    • 코인을 λ°›λŠ” recieve λ©”μ„œλ“œλ₯Ό μ„ μ–Έν–ˆλ‹€.
      • 코인을 λ°›μ•„ 은행에 μΆ”κ°€ν•˜λŠ” λ©”μ„œλ“œμ΄λ‹€. 이 코인을 ν™œμš©ν•˜μ—¬ κ²Œμž„μ„ μ§„ν–‰ν•œλ‹€κ³  κ°€μ •ν•˜λ©΄, μ‚¬μš©μžλŠ” κ²Œμž„μ„ ν•˜λŠ”λ° μ²˜μŒμ— 일정 코인을 μ€ν–‰μœΌλ‘œ λΆ€ν„° λ°›κ³  μ‹œμž‘ν•˜κ³ , 이길 λ•Œλ§ˆλ‹€ μ€ν–‰μ—μ„œ 코인을 λ°›μ•„ μ‚¬μš©μžμ˜ 지갑에 μ €μž₯ν•œλ‹€.
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) μ½”λ“œλ₯Ό λ„£μ–΄ μ‚¬μš©ν–ˆλ˜ λˆμ€ λͺ¨λ‘ 은행에 λ‹€μ‹œ λ°˜ν™˜ν•˜λ„λ‘ ν–ˆλ‹€.

β–· μΆ”κ°€μ„€λͺ…

  • Player ν΄λž˜μŠ€λŠ” coinsInPurse ν”„λ‘œνΌν‹°μ— ν˜„μž¬ ν”Œλ ˆμ΄μ–΄κ°€ 가진 코인 수λ₯Ό μ €μž₯ν•œλ‹€. λͺ¨λ“  ν”Œλ ˆμ΄μ–΄κ°€ 가진 μ½”μΈμ˜ μˆ˜κ°€ 10000κ°œκ°€ λ˜μ–΄μ•Όν•˜κΈ° λ•Œλ¬Έμ— λ§Œμ•½ ν”Œλ ˆμ΄μ–΄ μΈμŠ€ν„΄μŠ€λ₯Ό ν• λ‹Ή ν•΄μ œν•œλ‹€λ©΄, ν•΄λ‹Ή ν”Œλ ˆμ΄μ–΄μ˜ 코인을 λ‹€μ‹œ Bank μΈμŠ€ν„΄μŠ€λ‘œ λŒλ €μ€˜μ•Όν•œλ‹€. μ΄λŸ¬ν•œ 뢀뢄을 Player 클래슀의 μ†Œλ©Έμžλ‘œ κ΅¬ν˜„ν•œ μ½”λ“œμ΄λ‹€.
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의 코인을 μ†Œμœ ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.

100개의 코인을 가진 ν”Œλ ˆμ΄μ–΄1 μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜λ©΄ Bankμ—λŠ” 9900 코인이 λ‚¨κ²Œ λœλ‹€.

playerOne!.win(coins: 2_000)
print("PlayerOne won 2000 coins & now has \\(playerOne!.coinsInPurse) coins")
// Prints "PlayerOne won 2000 coins & now has 2100 coins"
// μ‚¬μš©μžκ°€ κ²Œμž„μ— 이겨 2000코인을 λ°›μ•„ μ²˜μŒμ— κ°–κ³  있던 100 코인과 λ”λΆˆμ–΄ ν˜„μž¬ 총 2100 코인을 μ†Œμœ ν•˜κ²Œ λ©λ‹ˆλ‹€.
print("The bank now only has \\(Bank.coinsInBank) coins left")
// Prints "The bank now only has 7900 coins left"
// μ‚¬μš©μžμ—κ²Œ 2100 코인을 λ‚˜λˆ μ€€ μ€ν–‰μ—λŠ” ν˜„μž¬ 7900 코인이 λ‚¨μ•˜μŠ΅λ‹ˆλ‹€.

ν”Œλ ˆμ΄μ–΄1이 κ²Œμž„μ—μ„œ μ΄κ²¨μ„œ 2000 코인을 νšλ“ν–ˆλ‹€. ν”Œλ ˆμ΄μ–΄ 1 μ§€κ°‘μ—λŠ” 2100 코인이, BankμΈμŠ€ν„΄μŠ€μ—λŠ” 7900 코인이 남을 것이닀.

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"

μ΄λ•Œ ν”Œλ ˆμ΄μ–΄1에 nil을 μ €μž₯ν•˜λ©΄, λ©”λͺ¨λ¦¬ 할당이 ν•΄μ œλ˜λŠ”λ° 이 λ•Œ Player클래슀의 μ†Œλ©Έμžκ°€ μ‹€ν–‰λ˜μ–΄ ν”Œλ ˆμ΄μ–΄1의 코인을 Bank에 λ°˜ν™˜ν•œλ‹€. λ”°λΌμ„œ λ‹€μ‹œ Bankκ°€ μ†Œμœ ν•œ 코인은 10000이 λœλ‹€.

λ°˜μ‘ν˜•