์๋ ํ์ธ์! ์ค๋์ Swift์ '์๋ ์ฐธ์กฐ ์นด์ดํ (Automatic Reference Counting, ARC)'์ ๋ํด ์์๋ณด๊ฒ ์ต๋๋ค. ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๋ ์ฑ ์ฑ๋ฅ๊ณผ ์์ ์ฑ์ ์ง๊ฒฐ๋๋ ์ค์ํ ์ฃผ์ ์ธ๋ฐ์, Swift์ ARC๋ฅผ ์ดํดํ๋ฉด ๋ฉ๋ชจ๋ฆฌ ๋์ ์๋ ํจ์จ์ ์ธ ์ฑ์ ๊ฐ๋ฐํ ์ ์์ต๋๋ค.
๐ ARC๋ ๋ฌด์์ธ๊ฐ?
์๋ ์ฐธ์กฐ ์นด์ดํ (ARC)์ Swift์์ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ์๋์ผ๋ก ์ถ์ ํ๊ณ ๊ด๋ฆฌํ๋ ์์คํ ์ ๋๋ค. ARC๋ ํด๋์ค ์ธ์คํด์ค๊ฐ ๋ ์ด์ ํ์ํ์ง ์์ ๋ ์๋์ผ๋ก ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํด์ ํฉ๋๋ค.
๋๋ถ๋ถ์ ๊ฒฝ์ฐ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๋ "๊ทธ๋ฅ ๋์ํ๋" ๋ฐฉ์์ผ๋ก, ๊ฐ๋ฐ์๊ฐ ํน๋ณํ ์ ๊ฒฝ ์ธ ํ์๊ฐ ์์ต๋๋ค. ํ์ง๋ง ํน์ ์ํฉ์์๋ ์ฝ๋์ ๊ฐ์ฒด ๊ฐ ๊ด๊ณ์ ๋ํด ARC์ ์ถ๊ฐ ์ ๋ณด๋ฅผ ์ ๊ณตํด์ผ ํ ํ์๊ฐ ์์ต๋๋ค.
์ค์: ARC๋ ํด๋์ค ์ธ์คํด์ค์๋ง ์ ์ฉ๋ฉ๋๋ค. ๊ตฌ์กฐ์ฒด(struct)์ ์ด๊ฑฐํ(enum)์ ๊ฐ ํ์ ์ด๋ฏ๋ก ์ฐธ์กฐ๋ก ์ ์ฅ๋๊ฑฐ๋ ์ ๋ฌ๋์ง ์์ต๋๋ค.
๐ ARC์ ์๋ ์๋ฆฌ
ํด๋์ค์ ์ ์ธ์คํด์ค๋ฅผ ์์ฑํ ๋ ARC๋ ์ธ์คํด์ค ์ ๋ณด๋ฅผ ์ ์ฅํ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋นํฉ๋๋ค. ์ด ๋ฉ๋ชจ๋ฆฌ์๋:
- ์ธ์คํด์ค์ ํ์ ์ ๋ณด
- ์ธ์คํด์ค์ ๊ด๋ จ๋ ๋ชจ๋ ์ ์ฅ ํ๋กํผํฐ์ ๊ฐ์ด ํฌํจ๋ฉ๋๋ค
์ธ์คํด์ค๊ฐ ๋ ์ด์ ํ์ํ์ง ์์ผ๋ฉด ARC๋ ํด๋น ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํด์ ํ์ฌ ๋ค๋ฅธ ์ฉ๋๋ก ์ฌ์ฉํ ์ ์๊ฒ ํฉ๋๋ค. ์ด๋ ํ์ํ์ง ์์ ์ธ์คํด์ค๊ฐ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฐจ์งํ์ง ์๋๋ก ๋ณด์ฅํฉ๋๋ค.
ARC๊ฐ ์ฌ์ฉ ์ค์ธ ์ธ์คํด์ค์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํด์ ํ๋ค๋ฉด? ํด๋น ์ธ์คํด์ค์ ํ๋กํผํฐ๋ ๋ฉ์๋์ ๋ ์ด์ ์ ๊ทผํ ์ ์๊ฒ ๋๊ณ , ์ ๊ทผ์ ์๋ํ๋ฉด ์ฑ์ด ์ถฉ๋(crash)ํ๊ฒ ๋ฉ๋๋ค!
์ด๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด ARC๋ ๋ช ๊ฐ์ ํ๋กํผํฐ, ์์, ๋ณ์๊ฐ ๊ฐ ํด๋์ค ์ธ์คํด์ค๋ฅผ ์ฐธ์กฐํ๊ณ ์๋์ง ์ถ์ ํฉ๋๋ค. ์ธ์คํด์ค์ ๋ํ ํ์ฑ ์ฐธ์กฐ๊ฐ ํ๋๋ผ๋ ์กด์ฌํ๋ ํ ARC๋ ์ธ์คํด์ค๋ฅผ ๋ฉ๋ชจ๋ฆฌ์์ ํด์ ํ์ง ์์ต๋๋ค.
๐ ARC ์ค์ ๋์ ์์
๋ค์ ์์ ๋ฅผ ํตํด ARC๊ฐ ์ด๋ป๊ฒ ๋์ํ๋์ง ์์๋ณด๊ฒ ์ต๋๋ค:
class Person {
let name: String
init(name: String) {
self.name = name
print("\(name)์ด(๊ฐ) ์ด๊ธฐํ๋ฉ๋๋ค")
}
deinit {
print("\(name)์ด(๊ฐ) ๋ฉ๋ชจ๋ฆฌ์์ ํด์ ๋ฉ๋๋ค")
}
}
// ์ต์
๋ Person ํ์
์ ๋ณ์๋ค ์์ฑ
var reference1: Person?
var reference2: Person?
var reference3: Person?
// ์ Person ์ธ์คํด์ค ์์ฑ
reference1 = Person(name: "ํ๊ธธ๋")
// ์ถ๋ ฅ: "ํ๊ธธ๋์ด(๊ฐ) ์ด๊ธฐํ๋ฉ๋๋ค"
// ๊ฐ์ ์ธ์คํด์ค๋ฅผ ๋ค๋ฅธ ๋ณ์์๋ ํ ๋น (๊ฐํ ์ฐธ์กฐ ์ถ๊ฐ)
reference2 = reference1
reference3 = reference1
// ๋ ๊ฐ์ ๋ณ์์์ ์ฐธ์กฐ ํด์
reference1 = nil
reference2 = nil
// ์ฌ์ ํ ํ๋์ ๊ฐํ ์ฐธ์กฐ๊ฐ ๋จ์์์
// ์ธ์คํด์ค๋ ํด์ ๋์ง ์์
// ๋ง์ง๋ง ๊ฐํ ์ฐธ์กฐ ํด์
reference3 = nil
// ์ถ๋ ฅ: "ํ๊ธธ๋์ด(๊ฐ) ๋ฉ๋ชจ๋ฆฌ์์ ํด์ ๋ฉ๋๋ค"
์ด ์์ ์์ ๋ณผ ์ ์๋ฏ์ด:
- Person ์ธ์คํด์ค๊ฐ ์์ฑ๋๋ฉด reference1์ ๊ฐํ ์ฐธ์กฐ๊ฐ ์ค์ ๋ฉ๋๋ค.
- ์ด ์ธ์คํด์ค๋ฅผ reference2์ reference3์ ํ ๋นํ๋ฉด ๊ฐํ ์ฐธ์กฐ๊ฐ 3๊ฐ๊ฐ ๋ฉ๋๋ค.
- reference1๊ณผ reference2๋ฅผ nil๋ก ์ค์ ํด๋ reference3๊ฐ ์ฌ์ ํ ์ธ์คํด์ค๋ฅผ ์ฐธ์กฐํ๊ณ ์์ด ๋ฉ๋ชจ๋ฆฌ์์ ํด์ ๋์ง ์์ต๋๋ค.
- ๋ง์ง๋ง์ผ๋ก reference3๋ง์ nil๋ก ์ค์ ํ๋ฉด ๊ฐํ ์ฐธ์กฐ๊ฐ ์์ด์ง๊ณ ์ธ์คํด์ค๊ฐ ๋ฉ๋ชจ๋ฆฌ์์ ํด์ ๋ฉ๋๋ค.
๐ ๊ฐํ ์ฐธ์กฐ ์ฌ์ดํด ๋ฌธ์
ARC๋ ๋๋ถ๋ถ์ ๊ฒฝ์ฐ ์ ์๋ํ์ง๋ง, ํน๋ณํ ์ํฉ์์๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค. ๊ทธ ์ค ํ๋๊ฐ **๊ฐํ ์ฐธ์กฐ ์ฌ์ดํด(Strong Reference Cycle)**์ ๋๋ค.
๊ฐํ ์ฐธ์กฐ ์ฌ์ดํด์ ๋ ํด๋์ค ์ธ์คํด์ค๊ฐ ์๋ก๋ฅผ ๊ฐํ๊ฒ ์ฐธ์กฐํ ๋ ๋ฐ์ํฉ๋๋ค. ์ด๋ฐ ๊ฒฝ์ฐ, ๋ ์ธ์คํด์ค๋ ์๋ก๋ฅผ "๋ถ์ก๊ณ " ์์ด ์ฐธ์กฐ ์นด์ดํธ๊ฐ 0์ด ๋์ง ์์ผ๋ฏ๋ก ๋ฉ๋ชจ๋ฆฌ์์ ํด์ ๋์ง ์์ต๋๋ค.
๊ฐํ ์ฐธ์กฐ ์ฌ์ดํด ์์
class Person {
let name: String
init(name: String) { self.name = name }
var apartment: Apartment?
deinit { print("\(name)์ด(๊ฐ) ๋ฉ๋ชจ๋ฆฌ์์ ํด์ ๋ฉ๋๋ค") }
}
class Apartment {
let unit: String
init(unit: String) { self.unit = unit }
var tenant: Person?
deinit { print("์ํํธ \(unit)์ด(๊ฐ) ๋ฉ๋ชจ๋ฆฌ์์ ํด์ ๋ฉ๋๋ค") }
}
// ์ธ์คํด์ค ์์ฑ
var john: Person? = Person(name: "ํ๊ธธ๋")
var unit4A: Apartment? = Apartment(unit: "4A")
// ์๋ก ์ฐธ์กฐํ๋๋ก ์ค์ (๊ฐํ ์ฐธ์กฐ ์ฌ์ดํด ์์ฑ)
john!.apartment = unit4A
unit4A!.tenant = john
// ์ธ๋ถ ์ฐธ์กฐ ์ ๊ฑฐ ์๋
john = nil
unit4A = nil
// ๋ ์ธ์คํด์ค ๋ชจ๋ ๋ฉ๋ชจ๋ฆฌ์์ ํด์ ๋์ง ์์
// deinit ๋ฉ์์ง๊ฐ ์ถ๋ ฅ๋์ง ์์
์ ์ฝ๋์์ Person๊ณผ Apartment ์ธ์คํด์ค๋ ์๋ก๋ฅผ ๊ฐํ๊ฒ ์ฐธ์กฐํ์ฌ ๊ฐํ ์ฐธ์กฐ ์ฌ์ดํด์ ํ์ฑํฉ๋๋ค. ์ธ๋ถ ์ฐธ์กฐ์ธ john๊ณผ unit4A๋ฅผ nil๋ก ์ค์ ํด๋ ๋ ์ธ์คํด์ค๋ ์ฌ์ ํ ์๋ก๋ฅผ ์ฐธ์กฐํ๊ณ ์์ด ๋ฉ๋ชจ๋ฆฌ์์ ํด์ ๋์ง ์์ต๋๋ค.
๐ ๊ฐํ ์ฐธ์กฐ ์ฌ์ดํด ํด๊ฒฐํ๊ธฐ
Swift๋ ๊ฐํ ์ฐธ์กฐ ์ฌ์ดํด์ ํด๊ฒฐํ๊ธฐ ์ํ ๋ ๊ฐ์ง ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค:
- ์ฝํ ์ฐธ์กฐ(Weak References)
- ๋ฏธ์์ ์ฐธ์กฐ(Unowned References)
1. ์ฝํ ์ฐธ์กฐ(Weak References)
์ฝํ ์ฐธ์กฐ๋ ์ฐธ์กฐํ๋ ์ธ์คํด์ค๋ฅผ ๊ฐํ๊ฒ ์ ์งํ์ง ์์ต๋๋ค. ์ฆ, ARC๊ฐ ์ฐธ์กฐ๋ ์ธ์คํด์ค๋ฅผ ํด์ ํ๋ ๊ฒ์ ๋ง์ง ์์ต๋๋ค. ์ฐธ์กฐํ๋ ์ธ์คํด์ค๊ฐ ๋ฉ๋ชจ๋ฆฌ์์ ํด์ ๋๋ฉด ์ฝํ ์ฐธ์กฐ๋ ์๋์ผ๋ก nil์ด ๋ฉ๋๋ค.
์ฝํ ์ฐธ์กฐ๋ weak ํค์๋๋ฅผ ์ฌ์ฉํ์ฌ ์ ์ธํฉ๋๋ค:
class Person {
let name: String
init(name: String) { self.name = name }
var apartment: Apartment?
deinit { print("\(name)์ด(๊ฐ) ๋ฉ๋ชจ๋ฆฌ์์ ํด์ ๋ฉ๋๋ค") }
}
class Apartment {
let unit: String
init(unit: String) { self.unit = unit }
weak var tenant: Person? // ์ฝํ ์ฐธ์กฐ๋ก ์ ์ธ
deinit { print("์ํํธ \(unit)์ด(๊ฐ) ๋ฉ๋ชจ๋ฆฌ์์ ํด์ ๋ฉ๋๋ค") }
}
var john: Person? = Person(name: "ํ๊ธธ๋")
var unit4A: Apartment? = Apartment(unit: "4A")
john!.apartment = unit4A
unit4A!.tenant = john
john = nil
// ์ถ๋ ฅ: "ํ๊ธธ๋์ด(๊ฐ) ๋ฉ๋ชจ๋ฆฌ์์ ํด์ ๋ฉ๋๋ค"
unit4A = nil
// ์ถ๋ ฅ: "์ํํธ 4A์ด(๊ฐ) ๋ฉ๋ชจ๋ฆฌ์์ ํด์ ๋ฉ๋๋ค"
์ฝํ ์ฐธ์กฐ๋ ๋ค์๊ณผ ๊ฐ์ ํน์ง์ด ์์ต๋๋ค:
- ํญ์ ์ต์ ๋ ํ์ ์ ๋ณ์๋ก ์ ์ธ๋ฉ๋๋ค (์ฐธ์กฐ๊ฐ nil์ด ๋ ์ ์์ด์ผ ํ๋ฏ๋ก)
- ์ฐธ์กฐ ๋์์ด ๋จผ์ ๋ฉ๋ชจ๋ฆฌ์์ ํด์ ๋ ์ ์๋ ๊ฒฝ์ฐ์ ์ฌ์ฉํฉ๋๋ค
2. ๋ฏธ์์ ์ฐธ์กฐ(Unowned References)
๋ฏธ์์ ์ฐธ์กฐ๋ ์ฐธ์กฐํ๋ ์ธ์คํด์ค๋ฅผ ๊ฐํ๊ฒ ์ ์งํ์ง ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ฝํ ์ฐธ์กฐ์ ๋ฌ๋ฆฌ, ๋ฏธ์์ ์ฐธ์กฐ๋ ์ฐธ์กฐํ๋ ์ธ์คํด์ค๊ฐ ํญ์ ์์ ๋ณด๋ค ์ค๋ ์กด์ฌํ๋ค๊ณ ๊ฐ์ ํฉ๋๋ค.
๋ฏธ์์ ์ฐธ์กฐ๋ unowned ํค์๋๋ฅผ ์ฌ์ฉํ์ฌ ์ ์ธํฉ๋๋ค:
class Customer {
let name: String
var card: CreditCard?
init(name: String) {
self.name = name
}
deinit { print("\(name)์ด(๊ฐ) ๋ฉ๋ชจ๋ฆฌ์์ ํด์ ๋ฉ๋๋ค") }
}
class CreditCard {
let number: UInt64
unowned let customer: Customer // ๋ฏธ์์ ์ฐธ์กฐ๋ก ์ ์ธ
init(number: UInt64, customer: Customer) {
self.number = number
self.customer = customer
}
deinit { print("์นด๋ #\(number)๊ฐ ๋ฉ๋ชจ๋ฆฌ์์ ํด์ ๋ฉ๋๋ค") }
}
var john: Customer? = Customer(name: "ํ๊ธธ๋")
john!.card = CreditCard(number: 1234_5678_9012_3456, customer: john!)
john = nil
// ์ถ๋ ฅ: "ํ๊ธธ๋์ด(๊ฐ) ๋ฉ๋ชจ๋ฆฌ์์ ํด์ ๋ฉ๋๋ค"
// ์ถ๋ ฅ: "์นด๋ #1234567890123456๊ฐ ๋ฉ๋ชจ๋ฆฌ์์ ํด์ ๋ฉ๋๋ค"
๋ฏธ์์ ์ฐธ์กฐ์ ํน์ง:
- ์ต์ ๋์ด ์๋ ํ์ ์ผ๋ก ์ ์ธ๋ฉ๋๋ค
- ์ฐธ์กฐ ๋์์ด ํญ์ ์์ ๋ณด๋ค ๊ฐ๊ฑฐ๋ ์ค๋ ์กด์ฌํ๋ ๊ฒฝ์ฐ์ ์ฌ์ฉํฉ๋๋ค
- ๋ฏธ์์ ์ฐธ์กฐ๊ฐ ํด์ ๋ ์ธ์คํด์ค๋ฅผ ์ฐธ์กฐํ๋ฉด ๋ฐํ์ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค
๋ฏธ์์ ์ต์ ๋ ์ฐธ์กฐ
Swift 5๋ถํฐ๋ ์ต์ ๋ ํ์ ์๋ unowned๋ฅผ ์ฌ์ฉํ ์ ์๊ฒ ๋์์ต๋๋ค:
class Department {
var name: String
var courses: [Course]
init(name: String) {
self.name = name
self.courses = []
}
}
class Course {
var name: String
unowned var department: Department
unowned var nextCourse: Course? // ๋ฏธ์์ ์ต์
๋ ์ฐธ์กฐ
init(name: String, in department: Department) {
self.name = name
self.department = department
self.nextCourse = nil
}
}
๐ ํด๋ก์ ์ ๊ฐํ ์ฐธ์กฐ ์ฌ์ดํด
ํด๋์ค ์ธ์คํด์ค ๊ฐ์๋ง ๊ฐํ ์ฐธ์กฐ ์ฌ์ดํด์ด ๋ฐ์ํ๋ ๊ฒ์ ์๋๋๋ค. ํด๋ก์ (Closure)์ ํด๋์ค ์ธ์คํด์ค ์ฌ์ด์์๋ ๊ฐํ ์ฐธ์กฐ ์ฌ์ดํด์ด ๋ฐ์ํ ์ ์์ต๋๋ค.
ํด๋ก์ ๋ ์ฐธ์กฐ ํ์ ์ด๋ฉฐ, ํด๋ก์ ๋ด๋ถ์์ self๋ฅผ ์ฌ์ฉํ์ฌ ํด๋์ค ์ธ์คํด์ค์ ํ๋กํผํฐ๋ ๋ฉ์๋์ ์ ๊ทผํ๋ฉด ํด๋น ์ธ์คํด์ค๋ฅผ ๊ฐํ๊ฒ ์บก์ฒํฉ๋๋ค. ๋์์ ํด๋์ค ์ธ์คํด์ค๊ฐ ํด๋ก์ ๋ฅผ ํ๋กํผํฐ๋ก ๊ฐ์ง๊ณ ์๋ค๋ฉด, ์๋ก ๊ฐํ ์ฐธ์กฐ๋ฅผ ์ ์งํ๊ฒ ๋ฉ๋๋ค.
ํด๋ก์ ์ ๊ฐํ ์ฐธ์กฐ ์ฌ์ดํด ์์
class HTMLElement {
let name: String
let text: String?
lazy var asHTML: () -> String = {
if let text = self.text {
return "<\(self.name)>\(text)</\(self.name)>"
} else {
return "<\(self.name) />"
}
}
init(name: String, text: String? = nil) {
self.name = name
self.text = text
}
deinit {
print("\(name)์ด(๊ฐ) ๋ฉ๋ชจ๋ฆฌ์์ ํด์ ๋ฉ๋๋ค")
}
}
var paragraph: HTMLElement? = HTMLElement(name: "p", text: "์๋
ํ์ธ์")
print(paragraph!.asHTML())
// ์ถ๋ ฅ: "<p>์๋
ํ์ธ์</p>"
paragraph = nil
// deinit ๋ฉ์์ง๊ฐ ์ถ๋ ฅ๋์ง ์์ - ๋ฉ๋ชจ๋ฆฌ ๋์ ๋ฐ์
์ด ์์ ์์ asHTML ํด๋ก์ ๋ self๋ฅผ ๊ฐํ๊ฒ ์บก์ฒํ๊ณ , HTMLElement ์ธ์คํด์ค๋ asHTML ํด๋ก์ ๋ฅผ ๊ฐํ๊ฒ ์ฐธ์กฐํฉ๋๋ค. ์ด๋ก ์ธํด ๊ฐํ ์ฐธ์กฐ ์ฌ์ดํด์ด ํ์ฑ๋์ด ๋ฉ๋ชจ๋ฆฌ ๋์๊ฐ ๋ฐ์ํฉ๋๋ค.
๐ ํด๋ก์ ์ ๊ฐํ ์ฐธ์กฐ ์ฌ์ดํด ํด๊ฒฐํ๊ธฐ
ํด๋ก์ ์ ๊ฐํ ์ฐธ์กฐ ์ฌ์ดํด์ ํด๊ฒฐํ๊ธฐ ์ํด Swift๋ **์บก์ฒ ๋ฆฌ์คํธ(Capture List)**๋ฅผ ์ ๊ณตํฉ๋๋ค. ์บก์ฒ ๋ฆฌ์คํธ๋ ํด๋ก์ ๋ด์์ ์บก์ฒํ ๋ ์ฌ์ฉํ ์ฐธ์กฐ ํ์ ์ ์ ์ํฉ๋๋ค.
์บก์ฒ ๋ฆฌ์คํธ ์ฌ์ฉ๋ฒ
class HTMLElement {
let name: String
let text: String?
lazy var asHTML: () -> String = {
[unowned self] in // ์บก์ฒ ๋ฆฌ์คํธ ์ฌ์ฉ
if let text = self.text {
return "<\(self.name)>\(text)</\(self.name)>"
} else {
return "<\(self.name) />"
}
}
init(name: String, text: String? = nil) {
self.name = name
self.text = text
}
deinit {
print("\(name)์ด(๊ฐ) ๋ฉ๋ชจ๋ฆฌ์์ ํด์ ๋ฉ๋๋ค")
}
}
var paragraph: HTMLElement? = HTMLElement(name: "p", text: "์๋
ํ์ธ์")
print(paragraph!.asHTML())
// ์ถ๋ ฅ: "<p>์๋
ํ์ธ์</p>"
paragraph = nil
// ์ถ๋ ฅ: "p์ด(๊ฐ) ๋ฉ๋ชจ๋ฆฌ์์ ํด์ ๋ฉ๋๋ค"
์บก์ฒ ๋ฆฌ์คํธ๋ ํด๋ก์ ์ ๋งค๊ฐ๋ณ์ ๋ชฉ๋ก ์์ ๋๊ดํธ([]) ๋ด์ ์์ฑํฉ๋๋ค. ์ ์์ ์์ [unowned self]๋ "ํด๋ก์ ์์ self๋ฅผ ๋ฏธ์์ ์ฐธ์กฐ๋ก ์บก์ฒํ๋ผ"๋ ์๋ฏธ์ ๋๋ค.
์บก์ฒ ๋ฆฌ์คํธ ์ ์ ๋ฐฉ๋ฒ
// ๋งค๊ฐ๋ณ์์ ๋ฐํ ํ์
์ด ์๋ ๊ฒฝ์ฐ
lazy var someClosure = {
[unowned self, weak delegate = self.delegate]
(index: Int, stringToProcess: String) -> String in
// ํด๋ก์ ๋ณธ๋ฌธ
}
// ๋งค๊ฐ๋ณ์์ ๋ฐํ ํ์
์ด ์๋ ๊ฒฝ์ฐ
lazy var someClosure = {
[unowned self, weak delegate = self.delegate] in
// ํด๋ก์ ๋ณธ๋ฌธ
}
๐ ์ฝํ ์ฐธ์กฐ์ ๋ฏธ์์ ์ฐธ์กฐ ์ค ์ ํํ๊ธฐ
์ฝํ ์ฐธ์กฐ์ ๋ฏธ์์ ์ฐธ์กฐ ์ค ์ด๋ค ๊ฒ์ ์ ํํด์ผ ํ ๊น์?
- ์ฝํ ์ฐธ์กฐ(weak)๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ:
- ์ฐธ์กฐํ๋ ์ธ์คํด์ค๊ฐ ๋จผ์ ๋ฉ๋ชจ๋ฆฌ์์ ํด์ ๋ ์ ์๋ ๊ฒฝ์ฐ
- ์ฐธ์กฐ๊ฐ ๋์ค์ nil์ด ๋ ์ ์๋ ๊ฒฝ์ฐ
- ์: ๋ธ๋ฆฌ๊ฒ์ดํธ ํจํด, ๋ถ๋ชจ-์์ ๊ด๊ณ์์ ๋ถ๋ชจ๊ฐ ์์์ ์ฐธ์กฐํ ๋
- ๋ฏธ์์ ์ฐธ์กฐ(unowned)๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ:
- ์ฐธ์กฐํ๋ ์ธ์คํด์ค๊ฐ ์์ ๊ณผ ๊ฐ์ ์๋ช ์ ๊ฐ์ง๊ฑฐ๋ ๋ ์ค๋ ์กด์ฌํ๋ ๊ฒฝ์ฐ
- ์ฐธ์กฐ๊ฐ ์ ๋ nil์ด ๋์ง ์์์ผ ํ๋ ๊ฒฝ์ฐ
- ์: ์ ์ฉ์นด๋์ ๊ณ ๊ฐ์ ๊ด๊ณ์ฒ๋ผ ํ ๊ฐ์ฒด๊ฐ ๋ค๋ฅธ ๊ฐ์ฒด ์์ด๋ ์กด์ฌํ ์ ์๋ ๊ฒฝ์ฐ
๐ ์ ๋ฆฌ
์๋ ์ฐธ์กฐ ์นด์ดํ (ARC)์ Swift์์ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๋ฅผ ์๋ํํ์ฌ ๊ฐ๋ฐ์์ ๋ถ๋ด์ ์ค์ฌ์ฃผ๋ ์ค์ํ ๊ธฐ๋ฅ์ ๋๋ค. ๊ทธ๋ฌ๋ ๊ฐํ ์ฐธ์กฐ ์ฌ์ดํด๊ณผ ๊ฐ์ ๋ฌธ์ ๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด์๋ ์ฝํ ์ฐธ์กฐ์ ๋ฏธ์์ ์ฐธ์กฐ๋ฅผ ์ ์ ํ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ์ดํดํด์ผ ํฉ๋๋ค.
์ฃผ์ ๊ธฐ์ต ํฌ์ธํธ:
- ARC๋ ํด๋์ค ์ธ์คํด์ค์๋ง ์ ์ฉ๋ฉ๋๋ค (๊ตฌ์กฐ์ฒด์ ์ด๊ฑฐํ์ ๊ฐ ํ์ )
- ๊ฐํ ์ฐธ์กฐ ์ฌ์ดํด์ ๋ฉ๋ชจ๋ฆฌ ๋์์ ์ฃผ์ ์์ธ์ ๋๋ค
- ์ฝํ ์ฐธ์กฐ(weak)๋ ์ฐธ์กฐ๊ฐ nil์ด ๋ ์ ์์ ๋ ์ฌ์ฉํฉ๋๋ค
- ๋ฏธ์์ ์ฐธ์กฐ(unowned)๋ ์ฐธ์กฐ๊ฐ ํญ์ ์ ํจํ ๋ ์ฌ์ฉํฉ๋๋ค
- ํด๋ก์ ์์๋ ์บก์ฒ ๋ฆฌ์คํธ๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐํ ์ฐธ์กฐ ์ฌ์ดํด์ ๋ฐฉ์งํฉ๋๋ค
'๐ฅ Bread Basics > Swift' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Swift ๊ณต์ ๋ฌธ์ ์ ๋ฆฌ - ๊ณ ๊ธ ์ฐ์ฐ์ (Advanced Operators) (1) | 2025.04.13 |
---|---|
Swift ๊ณต์ ๋ฌธ์ ์ ๋ฆฌ - ์ ๊ทผ ์ ์ด (Access Control) (0) | 2025.04.13 |
Swift ๊ณต์ ๋ฌธ์ ์ ๋ฆฌ - ๋ฉ๋ชจ๋ฆฌ ์์ ์ฑ (Memory Safety) (0) | 2025.04.13 |
Swift ๊ณต์ ๋ฌธ์ ์ ๋ฆฌ - ๋ถํฌ๋ช ํ ํ์ (Opaque Types) (0) | 2025.04.13 |
Swift ๊ณต์ ๋ฌธ์ ์ ๋ฆฌ - ์ ๋๋ฆญ (Generics) (0) | 2025.04.13 |
Swift ๊ณต์ ๋ฌธ์ ์ ๋ฆฌ - ํ๋กํ ์ฝ (Protocols) (0) | 2025.04.13 |
Swift ๊ณต์ ๋ฌธ์ ์ ๋ฆฌ - ํ์ฅ (Extensions) (0) | 2025.04.13 |
Swift ๊ณต์ ๋ฌธ์ ์ ๋ฆฌ - ์ค์ฒฉ๋ ํ์ (Nested Types) (1) | 2025.04.12 |