Deep Copy πŸ†š Shallow Copy

JasonΒ·2023λ…„ 10μ›” 20일
0

사전 지식 (Value type vs Reference type)

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)라고 ν•©λ‹ˆλ‹€.
μ‰½κ²Œ μƒκ°ν•˜μ—¬ λ³΅μ‚¬ν•˜κ³ μ‹Άμ–΄μš”β—οΈλΌκ³  말해도 μ¦‰μ‹œ λ³΅μ‚¬ν•˜μ§€ μ•ŠλŠ” 것이죠❗️
볡사 μ§ν›„μ—λŠ” 얕은 볡사λ₯Ό μ§„ν–‰ν•˜κ³  데이터에 λ³€ν˜•μ΄ μΌμ–΄λ‚˜λ©΄ κ·Έλ•Œ κΉŠμ€ 볡사λ₯Ό μ§„ν–‰ν•©λ‹ˆλ‹€.
(μ €λŠ” κ°•μ•„μ§€μ—κ²Œ 간식을 λ°”λ‘œ μ£Όμ§€μ•Šκ³  기닀리닀가 ν›ˆλ ¨μ˜ μ„±κ³Όλ‘œ μ£ΌλŠ” κ²ƒμœΌλ‘œ λ– μ˜¬λ €λ΄€μŠ΅λ‹ˆλ‹€ γ…Ž)

κ·Έλ ‡λ‹€λ©΄ 이제 얕은 볡사도 μ•Œμ•„λ³΄μ•„μ•Όκ² μ£  πŸ˜„

얕은 볡사

λ³΅μ‚¬λœ λ³€μˆ˜λŠ” μ›λž˜ λ³€μˆ˜κ°€ μ°Έμ‘°ν•˜λŠ” 객체와 같은 λ©”λͺ¨λ¦¬λ₯Ό μ°Έμ‘°ν•©λ‹ˆλ‹€.

또.. μ–΄λ €μš΄ λ¬Έμž₯으둜 μ„€λͺ…이 λ˜μ–΄μžˆμ§€λ§Œ ν’€μ–΄μ„œ μ‰½κ²Œ μ΄ν•΄ν•œλ‹€λ©΄
원본과 볡사본이 μ„œλ‘œ 같은 μ£Όμ†Œκ°’μ„ κ³΅μœ ν•œλ‹€κ³  바라보면 될 것 κ°™μŠ΅λ‹ˆλ‹€.
그리고 μžμ—°μŠ€λŸ½κ²Œ κ³΅μœ ν•œλ‹€λ©΄β“ μƒˆλ‘œμš΄ μΈμŠ€ν„΄μŠ€ λ©”λͺ¨λ¦¬κ°€ 생기지 μ•Šκ² μ£ β—οΈ

이런 λͺ¨μ–‘μƒˆλ₯Ό λ„κ³ μžˆκ² μ£ ?? γ…Žγ…Ž
κ·Έλ ‡λ‹€λ©΄ μ—¬κΈ°μ„œ ꢁ금증이 생길 μˆ˜λ„ μžˆμ£ β—οΈ

Q) μ°Έμ‘°(Reference) νƒ€μž…μ—μ„œ κΉŠμ€ 볡사λ₯Ό ν•  수 μ—†λ‚˜β“β“

(좜처: https://www.joongang.co.kr/article/21816819#home)

λ°”λ‘œ 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"

Summary

κΉŠμ€ 볡사, 얕은 볡사 μ΄μ œλŠ” μ’€ μ•Œ 것 κ°™μ•„μš” 😁

νƒ€μž…λ³΅μ‚¬ 방식μž₯점단점
κ°’(Vale)κΉŠμ€ λ³΅μ‚¬μΈμŠ€ν„΄μŠ€μ˜ λ³€ν™”κ°€ λ‹€λ₯Έ μΈμŠ€ν„΄μŠ€μ— 영ν–₯을 주지 μ•ŠλŠ”λ‹€λ©”λͺ¨λ¦¬ μ†ŒλΉ„κ°€ λ§Žλ‹€.
μ°Έμ‘°(Reference)얕은 볡사메λͺ¨λ¦¬ μ ˆμ•½μΈμŠ€ν„΄μŠ€μ˜ λ³€ν™”κ°€ 같은 λ©”λͺ¨λ¦¬ μ£Όμ†Œλ₯Ό μ°Έμ‘°ν•˜λŠ” μΈμŠ€ν„΄μŠ€μ— 영ν–₯을 μ€€λ‹€.

각각의 단점 보완 λ°©μ‹μœΌλ‘œ

  • κ°’ νƒ€μž…μ—μ„œλŠ” CoW(Copy-on-Write) μ‚¬μš©
  • (λ‹¨μ μœΌλ‘œ μž‘μš©ν•˜λŠ” 경우) μ°Έμ‘° νƒ€μž…μ—μ„œλŠ” NSCopying을 ν™œμš©

μ΄λ ‡κ²Œ 정리할 수 μžˆμ„ 것 κ°™μŠ΅λ‹ˆλ‹€ πŸ‘πŸ»
CoW에 λŒ€ν•΄ μž‘μ„±ν•˜κ³  μ‹Άμ§€λ§Œ λ„ˆλ¬΄ κΈΈμ–΄μ§ˆ 것 κ°™μ•„μ„œ
CoW와 Paging κΈ°λ²•μ—μ„œμ˜ CoWλ₯Ό 같이 μž‘μ„±ν•˜λ €λ‹€λ³΄λ‹ˆ... λ‹€μŒ μ‹œκ°„μ—..πŸ™„

🌐 Reference Site
[Swift] κΉŠμ€ 볡사와 얕은 볡사(feat. NSCopying)
Copy on Write in Swift
Swift κ³΅μ‹λ¬Έμ„œ
NSCopying|Apple Developer Documentation

profile
πŸ§‘πŸΌβ€πŸ’» iOS developer

0개의 λŒ“κΈ€