https://medium.com/@cseankurbuet/understanding-deep-copy-and-shallow-copy-in-swift-8df201375611
글을 번역한 것이니 원문을 보는 것을 추천한다.
데이터를 그대로 복사하여 복사한 두 데이터 객체는 각각의 메모리를 가진다.
struct Person {
var name: String
}
var eddy = Person(name: "eddy")
var eddy2 = eddy
eddy2.name = "eddy2"
구조체로 깊은 복사가 일어나고 다른 객체에 할당하고 값을 변경하게 되면 기존 객체의 값은 변경되지 않는다.
그 이유로는 스택에 다른 객체가 쌓여 주소값이 다르기 때문에 확인할 수 있다.
인스턴스가 독립적인 것이 증명된다.
데이터를 복사해도 인스턴스 메모리가 새로 생성되는 것이 아닌 값의 주소를 복사하여 같은 값을 가르킨다.
보통 참조타입인 경우 얕은 복사로 이루어진다.
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)
위와 같이 같은 힙에 값을 가지고 스택에는 힙 데이터 실제 값을 가르키는 같은 주소값을 가진다.
동일하게 이름에 대한 값도 바뀐다.
같은 메모리 영역을 가르키고 차지하는것이 얕은 복사의 특징이다.
NSCopying 프로토콜을 채택해서 사용하면 된다.
https://green1229.tistory.com/126
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 인스턴스에 할당해주게 되면 깊은 복사가 일어나 다른 메모리 영역을 가지는걸 확인할 수 있다.
참조 타입 내부에 참조 타입을 가진다면 해당 타입에 대해 이뤄진 데이터는 얕은 복사를 하게 된다.