μλ νμΈμ, κ°μμ λλ€. μ§λλ² 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μ΄ λλ€.