shallow copy vs deep copy in Swift

Eddy📱·2022년 9월 2일
0
post-thumbnail

https://medium.com/@cseankurbuet/understanding-deep-copy-and-shallow-copy-in-swift-8df201375611
글을 번역한 것이니 원문을 보는 것을 추천한다.

deep copy

데이터를 그대로 복사하여 복사한 두 데이터 객체는 각각의 메모리를 가진다.

struct Person {
    var name: String
}

var eddy = Person(name: "eddy")
var eddy2 = eddy
eddy2.name = "eddy2"

구조체로 깊은 복사가 일어나고 다른 객체에 할당하고 값을 변경하게 되면 기존 객체의 값은 변경되지 않는다.

그 이유로는 스택에 다른 객체가 쌓여 주소값이 다르기 때문에 확인할 수 있다.

인스턴스가 독립적인 것이 증명된다.

shallow copy

데이터를 복사해도 인스턴스 메모리가 새로 생성되는 것이 아닌 값의 주소를 복사하여 같은 값을 가르킨다.

보통 참조타입인 경우 얕은 복사로 이루어진다.

class Person {
    var name: String

    init(_ name: String) {
        self.name = name
    }
}

var eddy  = Person("eddy")
var eddy2 = eddy
eddy2.name = "eddy2"

print(eddy)
print(eddy2)

위와 같이 같은 힙에 값을 가지고 스택에는 힙 데이터 실제 값을 가르키는 같은 주소값을 가진다.
동일하게 이름에 대한 값도 바뀐다.
같은 메모리 영역을 가르키고 차지하는것이 얕은 복사의 특징이다.

꼬리질문

참조타입에서 deep copy 하려면 어떻게 해야할지?

NSCopying 프로토콜을 채택해서 사용하면 된다.

https://green1229.tistory.com/126

NSCopying 프로토콜이란?

copy() 메서드 사용하여 참조타입에서도 deep copy를 가능하게 해주는 프로토콜이다.

class Person: 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 {
        return Person(self.name, self.age)
    }
}

var eddy = Person("eddy", 31)
var eddy2 = eddy.copy() as! Person
eddy2.name = "eddy2"

print(eddy.name)
print(eddy2.name)

위와 같이 copy() 메서드를 통해 red 인스턴스에 할당해주게 되면 깊은 복사가 일어나 다른 메모리 영역을 가지는걸 확인할 수 있다.
참조 타입 내부에 참조 타입을 가진다면 해당 타입에 대해 이뤄진 데이터는 얕은 복사를 하게 된다.

profile
Make a better world

0개의 댓글