μλ νμΈμ. μ΄μ ν¬μ€ν μμ Swiftμ μ΄κΈ°ν(Initialization)μ λν΄ μμ보μλλ°μ, μ€λμ κ·Έ λ°λνΈμ μλ 'μ΄κΈ°ν ν΄μ (Deinitialization)'μ λν΄ μμλ³΄κ² μ΅λλ€. κ°μ²΄μ μλͺ μ£ΌκΈ° λμμ μ€μν μν μ νλ μ΄ κ°λ μ μ΄ν΄νλ©΄ Swiftμ λ©λͺ¨λ¦¬ κ΄λ¦¬λ₯Ό λ ν¨κ³Όμ μΌλ‘ ν μ μμ΅λλ€.
π μ΄κΈ°ν ν΄μ λ? (What is Deinitialization?)
μ΄κΈ°ν ν΄μ λ ν΄λμ€ μΈμ€ν΄μ€κ° λ©λͺ¨λ¦¬μμ ν΄μ λκΈ° μ§μ μ μνλλ μ 리 μμ μ λλ€. Swiftμμλ deinit ν€μλλ₯Ό μ¬μ©νμ¬ μ΄ νΉλ³ν λ©μλλ₯Ό μ μν©λλ€.
deinit {
// μ 리 μμ
μν
}
μ΄κΈ°ν ν΄μ ꡬ문(Deinitializer): μΈμ€ν΄μ€κ° λ©λͺ¨λ¦¬μμ ν΄μ λκΈ° μ§μ μ μλμΌλ‘ νΈμΆλλ νΉλ³ν λ©μλλ‘, 리μμ€ μ 리 μμ μ μνν©λλ€.
π μ΄κΈ°ν ν΄μ λ μ΄λ»κ² λμνλμ?
Swiftλ ARC(Automatic Reference Counting)λ₯Ό ν΅ν΄ λ©λͺ¨λ¦¬λ₯Ό μλμΌλ‘ κ΄λ¦¬ν©λλ€. λ μ΄μ μΈμ€ν΄μ€λ₯Ό μ°Έμ‘°νλ κ³³μ΄ μμΌλ©΄ ν΄λΉ μΈμ€ν΄μ€λ λ©λͺ¨λ¦¬μμ μλμΌλ‘ ν΄μ λ©λλ€.
μ΄κΈ°ν ν΄μ ꡬ문μ μ£Όμ νΉμ§μ λ€μκ³Ό κ°μ΅λλ€:
- ν΄λμ€λ§ μ΄κΈ°ν ν΄μ ꡬ문μ κ°μ§ μ μμ΅λλ€ (ꡬ쑰체λ μ΄κ±°νμ λΆκ°)
- ν΄λμ€λΉ νλμ μ΄κΈ°ν ν΄μ κ΅¬λ¬Έλ§ μ μν μ μμ΅λλ€
- νλΌλ―Έν°λ₯Ό κ°μ§μ§ μμ΅λλ€
- μ§μ νΈμΆν μ μκ³ , μμ€ν μ μν΄ μλμΌλ‘ νΈμΆλ©λλ€
- μΈμ€ν΄μ€κ° λ©λͺ¨λ¦¬μμ ν΄μ λκΈ° μ§μ μ νΈμΆλ©λλ€
ARC(Automatic Reference Counting): Swiftμμ λ©λͺ¨λ¦¬λ₯Ό κ΄λ¦¬νλ λ°©μμΌλ‘, μΈμ€ν΄μ€μ λν μ°Έμ‘°λ₯Ό μΆμ νμ¬ λ μ΄μ μ°Έμ‘°λμ§ μμΌλ©΄ μλμΌλ‘ λ©λͺ¨λ¦¬λ₯Ό ν΄μ ν©λλ€.
π μμκ³Ό μ΄κΈ°ν ν΄μ ꡬ문
μ΄κΈ°ν ν΄μ ꡬ문μ μμ κ΄κ³μμ νΉμ μμλ‘ νΈμΆλ©λλ€:
- νμ ν΄λμ€μ μ΄κΈ°ν ν΄μ κ΅¬λ¬Έμ΄ λ¨Όμ νΈμΆλ©λλ€
- κ·Έ λ€μ μμ ν΄λμ€μ μ΄κΈ°ν ν΄μ κ΅¬λ¬Έμ΄ νΈμΆλ©λλ€
- μ΄ κ³Όμ μ μ΅μμ ν΄λμ€κΉμ§ κ³μλ©λλ€
μ΄λ μ΄κΈ°ν(initialization)μλ λ°λ μμμ λλ€. μ΄κΈ°νλ μμ ν΄λμ€λΆν° νμ ν΄λμ€ μμΌλ‘ μ§νλμ§λ§, μ΄κΈ°ν ν΄μ λ νμ ν΄λμ€λΆν° μμ ν΄λμ€ μμΌλ‘ μ§νλ©λλ€.
μ€μ: νμ ν΄λμ€κ° μ΄κΈ°ν ν΄μ ꡬ문μ ꡬννμ§ μμλ μμ ν΄λμ€μ μ΄κΈ°ν ν΄μ ꡬ문μ μλμΌλ‘ νΈμΆλ©λλ€.
π μ΄κΈ°ν ν΄μ ꡬ문μ νμ©
μ΄κΈ°ν ν΄μ ꡬ문μ μ£Όλ‘ λ€μκ³Ό κ°μ μν©μμ μ¬μ©λ©λλ€:
- νμΌ, λ€νΈμν¬ μ°κ²° λ± μΈλΆ 리μμ€ λ«κΈ°
- μμ λλ ν 리λ νμΌ μμ
- μμ€ν μλ¦Ό ꡬλ ν΄μ
- νμ΄λ¨Έ μ€μ§
- λ€λ₯Έ κ°μ²΄μκ² μμ μ μλ©Έμ μ리기
μ΄κΈ°ν ν΄μ ꡬ문 λ΄μμλ ν΄λΉ μΈμ€ν΄μ€μ λͺ¨λ νλ‘νΌν°μ μ κ·Όν μ μμΌλ©°, μ΄ νλ‘νΌν°λ€μ κΈ°λ°μΌλ‘ μ 리 μμ μ μνν μ μμ΅λλ€.
π μ€μ μμ : κ²μ λ΄ μ½μΈ κ΄λ¦¬ μμ€ν
λ€μμ κ²μ μλ리μ€λ₯Ό ν΅ν΄ μ΄κΈ°ν ν΄μ ꡬ문μ νμ©μ 보μ¬μ£Όλ μμ μ λλ€:
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 ν΄λμ€λ κ²μ λ΄ μνμ λνλ΄λ©°, μ½μΈμ λΆλ°°μ μμ§μ κ΄λ¦¬ν©λλ€.
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 ν΄λμ€λ κ²μ νλ μ΄μ΄λ₯Ό λνλ΄λ©°:
- μ΄κΈ°ν μ μνμμ μ½μΈμ λ°μμ΅λλ€
- κ²μμμ μ΄κΈΈ λ μΆκ° μ½μΈμ λ°μ μ μμ΅λλ€
- μ΄κΈ°ν ν΄μ μ νλ μ΄μ΄κ° κ°μ§ λͺ¨λ μ½μΈμ μνμ λ°νν©λλ€
μ΄ μμ λ μ΄κΈ°ν ν΄μ κ΅¬λ¬Έμ΄ λ¦¬μμ€ κ΄λ¦¬μ μ΄λ»κ² νμ©λλμ§ λ³΄μ¬μ€λλ€. νλ μ΄μ΄κ° κ²μμ λ λ λ κ·Έλ€μ΄ κ°μ§ μ½μΈμ μλμΌλ‘ μνμΌλ‘ λ°νλ©λλ€.
μ€ν μμ
var playerOne: Player? = Player(coins: 100)
print("μλ‘μ΄ νλ μ΄μ΄κ° \(playerOne!.coinsInPurse)κ°μ μ½μΈμΌλ‘ κ²μμ μ°Έκ°νμ΅λλ€")
// μΆλ ₯: "μλ‘μ΄ νλ μ΄μ΄κ° 100κ°μ μ½μΈμΌλ‘ κ²μμ μ°Έκ°νμ΅λλ€"
print("μνμλ νμ¬ \(Bank.coinsInBank)κ°μ μ½μΈμ΄ λ¨μμμ΅λλ€")
// μΆλ ₯: "μνμλ νμ¬ 9900κ°μ μ½μΈμ΄ λ¨μμμ΅λλ€"
playerOne!.win(coins: 2_000)
print("νλ μ΄μ΄1μ΄ 2000κ°μ μ½μΈμ νλνμ¬ νμ¬ \(playerOne!.coinsInPurse)κ°μ μ½μΈμ 보μ μ€μ
λλ€")
// μΆλ ₯: "νλ μ΄μ΄1μ΄ 2000κ°μ μ½μΈμ νλνμ¬ νμ¬ 2100κ°μ μ½μΈμ 보μ μ€μ
λλ€"
print("μνμλ μ΄μ \(Bank.coinsInBank)κ°μ μ½μΈλ§ λ¨μμμ΅λλ€")
// μΆλ ₯: "μνμλ μ΄μ 7900κ°μ μ½μΈλ§ λ¨μμμ΅λλ€"
// νλ μ΄μ΄κ° κ²μμ λ λ©λλ€ - μ΄κΈ°ν ν΄μ κ΅¬λ¬Έμ΄ νΈμΆλ©λλ€
playerOne = nil
print("νλ μ΄μ΄1μ΄ κ²μμ λ λ¬μ΅λλ€")
// μΆλ ₯: "νλ μ΄μ΄1μ΄ κ²μμ λ λ¬μ΅λλ€"
print("μνμλ μ΄μ \(Bank.coinsInBank)κ°μ μ½μΈμ΄ μμ΅λλ€")
// μΆλ ₯: "μνμλ μ΄μ 10000κ°μ μ½μΈμ΄ μμ΅λλ€"
μ΄ μμ λ₯Ό 보면:
- νλ μ΄μ΄κ° 100κ°μ μ½μΈμΌλ‘ κ²μμ μμν©λλ€
- νλ μ΄μ΄κ° 2,000κ°μ μ½μΈμ λ μ»μ΅λλ€
- νλ μ΄μ΄κ° κ²μμ λ λ λ(playerOne = nil), μ΄κΈ°ν ν΄μ κ΅¬λ¬Έμ΄ νΈμΆλμ΄ λͺ¨λ μ½μΈμ΄ μνμΌλ‘ λ°νλ©λλ€
- κ²°κ³Όμ μΌλ‘ μνμ μλ μνμΈ 10,000κ°μ μ½μΈμ λ€μ 보μ νκ² λ©λλ€
π μ΄κΈ°ν ν΄μ μ¬μ© μ μ£Όμμ¬ν
- μ¬μ© λ²μ μ ν: μ΄κΈ°ν ν΄μ ꡬ문μ κΌ νμν κ²½μ°μλ§ μ¬μ©νμΈμ. λλΆλΆμ κ²½μ° Swiftμ ARCκ° λ©λͺ¨λ¦¬ κ΄λ¦¬λ₯Ό μμμ μ ν΄μ€λλ€.
- μν μ°Έμ‘° μ£Όμ: μ΄κΈ°ν ν΄μ κ΅¬λ¬Έμ΄ νΈμΆλμ§ μλλ€λ©΄, μν μ°Έμ‘°(circular reference) λ¬Έμ κ° μμ μ μμ΅λλ€. μ΄λ ARCκ° λ©λͺ¨λ¦¬λ₯Ό ν΄μ νμ§ λͺ»νκ² νλ μμΈμ΄ λ©λλ€.
- λΉλκΈ° μμ μ£Όμ: μ΄κΈ°ν ν΄μ ꡬ문 λ΄μμ λΉλκΈ° μμ μ μμνλ©΄ μ λ©λλ€. μΈμ€ν΄μ€κ° μ΄λ―Έ ν΄μ μ€μ΄κΈ° λλ¬Έμ μκΈ°μΉ μμ λ¬Έμ κ° λ°μν μ μμ΅λλ€.
- μμ€ν 리μμ€ ν΄μ : νμΌ νΈλ€, λ€νΈμν¬ μ°κ²° λ± μμ€ν 리μμ€λ₯Ό μ¬μ©ν κ²½μ°μλ λ°λμ μ΄κΈ°ν ν΄μ ꡬ문μμ μ΄λ₯Ό μ 리ν΄μ£Όμ΄μΌ ν©λλ€.
ν: λλ²κΉ μ€μ μ΄κΈ°ν ν΄μ κ΅¬λ¬Έμ΄ νΈμΆλλμ§ νμΈνλ €λ©΄, λ΄λΆμ print λ¬Έμ μΆκ°νμ¬ λ‘κ·Έλ₯Ό λ¨κ²¨λ³Ό μ μμ΅λλ€.
π μ 리
μ΄κΈ°ν ν΄μ λ Swiftμμ ν΄λμ€ μΈμ€ν΄μ€μ μλͺ μ£ΌκΈ° λ§μ§λ§μ μ€μν μν μ ν©λλ€. νΉν μΈλΆ 리μμ€λ₯Ό μ¬μ©νλ ν΄λμ€μμλ μ΄λ₯Ό μ μ ν νμ©νλ κ²μ΄ λ©λͺ¨λ¦¬ λμλ 리μμ€ λμλ₯Ό λ°©μ§νλ λ° μ€μν©λλ€.
μ΄κΈ°ν ν΄μ ꡬ문μ μ£Όμ ν¬μΈνΈ:
- ν΄λμ€λ§ κ°μ§ μ μμ
- ν΄λμ€λΉ νλλ§ μ μ κ°λ₯
- νλΌλ―Έν° μμ
- μλμΌλ‘ νΈμΆλ¨
- μμ μ νμ ν΄λμ€λΆν° μμ ν΄λμ€ μμΌλ‘ νΈμΆλ¨
Swiftμ ARC λλΆμ λλΆλΆμ κ²½μ° λͺ μμ μΈ λ©λͺ¨λ¦¬ κ΄λ¦¬κ° νμνμ§ μμ§λ§, μΈλΆ 리μμ€λ₯Ό μ¬μ©νλ κ²½μ° μ΄κΈ°ν ν΄μ ꡬ문μ ν΅ν΄ μ΄λ₯Ό μ μ ν μ 리νλ κ²μ΄ μ’μ νλ‘κ·Έλλ° μ΅κ΄μ λλ€.
'π₯ Bread Basics > Swift' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
Swift 곡μ λ¬Έμ μ 리 - λ§€ν¬λ‘ (Macros) (0) | 2025.04.11 |
---|---|
Swift 곡μ λ¬Έμ μ 리 - λμμ± (Concurrency) (0) | 2025.04.11 |
Swift 곡μ λ¬Έμ μ 리 - μλ¬ μ²λ¦¬ (Error Handling) (0) | 2025.04.11 |
Swift 곡μ λ¬Έμ μ 리 - μ΅μ λ 체μ΄λ (Optional Chaining) (0) | 2025.04.11 |
Swift 곡μ λ¬Έμ μ 리 - μ΄κΈ°ν (Initialization) (0) | 2025.04.11 |
Swift 곡μ λ¬Έμ μ 리 - μμ (Inheritance) (0) | 2025.04.11 |
Swift 곡μ λ¬Έμ μ 리 - μλΈ μ€ν¬λ¦½νΈ (Subscripts) (0) | 2025.04.11 |
Swift 곡μ λ¬Έμ μ 리 - λ©μλ (Methods) (0) | 2025.04.11 |