Swift μΈμ΄λ₯Ό λ°°μ°κΈ° μμνλ©΄ κ°μ₯ λ§μ΄ λ£λ λ§λ€μ΄ struct vs class
μλ‘λ₯Ό λΉκ΅νλ κ²λ€μ΄ λ§μλλ° μ΄λ²μ CS(computer Science)λ₯Ό νμ΅νλ©° ν λ² μ 리νκ³ μΆλ€λ λ§μμ κΈμ μμ±ν©λλ€.
μ°μ , κ° νμ
(Value type), μ°Έμ‘° νμ
(Reference type)μ μλ‘ λ³΅μ¬νλ λ°©μμ΄ λ€λ¦
λλ€.
νμ | λ³΅μ¬ λ°©μ |
---|---|
κ°(Value) | κΉμ 볡μ¬(Deep Copy) |
μ°Έμ‘°(Reference) | μμ 볡μ¬(Shallow Copy) |
π€ κ·ΈλΌ κ°κ°μ νΉμ§μ μμ보μμΌ νκ² μ£ ?
λ°μ΄ν° μ체λ₯Ό 볡μ¬νλ λ°©λ²
μ μ체λ₯Ό 볡μ¬νλ€... μ’ λ μμΈν μλ―Έλ₯Ό μ΄ν΄νλ©΄ μ’μ κ² κ°μ΅λλ€.
struct Person {
var name: String
var age: Int
}
var person1 = Person(name: "John", age: 30)
var person2 = person1
person2.name = "Mike"
print(person1.name) // μΆλ ₯: "John"
print(person2.name) // μΆλ ₯: "Mike"
볡μ¬λ³Έ person2 κ°μ λ°κΏλ μλ³Έ person1μ κ°μλ μν₯μ λ―ΈμΉμ§ μμ£ .
μ¦, μ½κ² λ°λΌλ³΄λ©΄ 볡μ¬ν΄λ μλ‘ λ€λ₯Έ λ©λͺ¨λ¦¬ μμμ μ¬μ©
νλ€.
μ’ λ μ΄λ €μ΄ μ€λͺ
μ νλ©΄ κ°μ λ
립μ μΈ λ©λͺ¨λ¦¬ μμμ μ¬μ©νκΈ°μ 볡μ¬ν μΈμ€ν΄μ€μ λ°μ΄ν°μ λ³νμ μ€λ μλ³Έμλ μν₯μ λ―ΈμΉμ§ μλλ€
κ³ μ΄ν΄ν μ μμ΅λλ€.
κ·Έλ λ€λ©΄ μμμ νμ μ μΈλ°... κ³μ 볡μ¬νλ©΄ μ΄λ‘νμ§...βββ λ»λλκ±° μλμΌββοΈ π€―
κ·Έλμ κ³ μν λ°©λ²μ΄ CoW(Copy-on-Write)
λΌκ³ ν©λλ€.
μ½κ² μκ°νμ¬ λ³΅μ¬νκ³ μΆμ΄μβοΈ
λΌκ³ λ§ν΄λ μ¦μ 볡μ¬νμ§ μλ κ²μ΄μ£ βοΈ
λ³΅μ¬ μ§νμλ μμ 볡μ¬
λ₯Ό μ§ννκ³ λ°μ΄ν°μ λ³νμ΄ μΌμ΄λλ©΄ κ·Έλ κΉμ 볡μ¬
λ₯Ό μ§νν©λλ€.
(μ λ κ°μμ§μκ² κ°μμ λ°λ‘ μ£Όμ§μκ³ κΈ°λ€λ¦¬λ€κ° νλ ¨μ μ±κ³Όλ‘ μ£Όλ κ²μΌλ‘ λ μ¬λ €λ΄€μ΅λλ€ γ
)
κ·Έλ λ€λ©΄ μ΄μ μμ 볡μ¬λ μμ보μμΌκ² μ£ π
볡μ¬λ λ³μλ μλ λ³μκ° μ°Έμ‘°νλ κ°μ²΄μ κ°μ λ©λͺ¨λ¦¬λ₯Ό μ°Έμ‘°ν©λλ€.
λ.. μ΄λ €μ΄ λ¬Έμ₯μΌλ‘ μ€λͺ
μ΄ λμ΄μμ§λ§ νμ΄μ μ½κ² μ΄ν΄νλ€λ©΄
μλ³Έκ³Ό 볡μ¬λ³Έμ΄ μλ‘ κ°μ μ£Όμκ°μ 곡μ νλ€
κ³ λ°λΌλ³΄λ©΄ λ κ² κ°μ΅λλ€.
κ·Έλ¦¬κ³ μμ°μ€λ½κ² 곡μ νλ€λ©΄β μλ‘μ΄ μΈμ€ν΄μ€ λ©λͺ¨λ¦¬κ° μκΈ°μ§ μκ² μ£ βοΈ
μ΄λ° λͺ¨μμλ₯Ό λκ³ μκ² μ£ ?? γ
γ
κ·Έλ λ€λ©΄ μ¬κΈ°μ κΆκΈμ¦μ΄ μκΈΈ μλ μμ£ βοΈ
(μΆμ²: https://www.joongang.co.kr/article/21816819#home)Q) μ°Έμ‘°(Reference) νμ μμ κΉμ 볡μ¬λ₯Ό ν μ μλββ
λ°λ‘ NSCopying νλ‘ν μ½μ μ΄μ©νμ¬ κ΅¬νν μ μμ΅λλ€.
class DeepCopyClass: NSCopying {
var name: String
var age: Int
init(name: String, age: Int) {
self.name = name
self.age = age
}
func copy(with zone: NSZone? = nil) -> Any {
let copy = DeepCopyClass(name: name, age: age)
return copy
}
}
let original = DeepCopyClass(name: "John", age: 30)
let copied = original.copy() as! DeepCopyClass
copied.name = "Mike"
print(original.name) // Output: "John"
print(copied.name) // Output: "Mike"
κΉμ 볡μ¬, μμ λ³΅μ¬ μ΄μ λ μ’ μ κ² κ°μμ π
νμ | λ³΅μ¬ λ°©μ | μ₯μ | λ¨μ |
---|---|---|---|
κ°(Vale) | κΉμ λ³΅μ¬ | μΈμ€ν΄μ€μ λ³νκ° λ€λ₯Έ μΈμ€ν΄μ€μ μν₯μ μ£Όμ§ μλλ€ | λ©λͺ¨λ¦¬ μλΉκ° λ§λ€. |
μ°Έμ‘°(Reference) | μμ λ³΅μ¬ | λ©λͺ¨λ¦¬ μ μ½ | μΈμ€ν΄μ€μ λ³νκ° κ°μ λ©λͺ¨λ¦¬ μ£Όμλ₯Ό μ°Έμ‘°νλ μΈμ€ν΄μ€μ μν₯μ μ€λ€. |
κ°κ°μ λ¨μ 보μ λ°©μμΌλ‘
μ΄λ κ² μ 리ν μ μμ κ² κ°μ΅λλ€ ππ»
CoWμ λν΄ μμ±νκ³ μΆμ§λ§ λ무 κΈΈμ΄μ§ κ² κ°μμ
CoWμ Paging κΈ°λ²μμμ CoWλ₯Ό κ°μ΄ μμ±νλ €λ€λ³΄λ... λ€μ μκ°μ..π
π Reference Site
[Swift] κΉμ 볡μ¬μ μμ 볡μ¬(feat. NSCopying)
Copy on Write in Swift
Swift 곡μλ¬Έμ
NSCopying|Apple Developer Documentation