알고리즘 풀다가 얕은 복사와 깊은 복사 구분이 안되서 기록해 본다.
fun main() {
val src1 = arrayListOf(arrayOf("ICN", "A"), arrayOf("ICN", "B"), arrayOf("B", "ICN"))
val src2 = arrayListOf(arrayOf("ICN", "A"), arrayOf("ICN", "B"), arrayOf("B", "ICN"))
val src3 = arrayListOf(arrayOf("ICN", "A"), arrayOf("ICN", "B"), arrayOf("B", "ICN"))
val src4 = arrayListOf(arrayOf("ICN", "A"), arrayOf("ICN", "B"), arrayOf("B", "ICN"))
val copiedAddAll = ArrayList<Array<String>>()
val copiedForEachAdd = ArrayList<Array<String>>()
val copiedConstructWithSrc = ArrayList<Array<String>>(src3)
val copiedForEachAddCopyOf = ArrayList<Array<String>>()
copiedAddAll.addAll(src1) // addAll
src2.forEach { copiedForEachAdd.add(it) } // for each add
src4.forEach { copiedForEachAddCopyOf.add(it.copyOf()) }// for each add copy of
copiedAddAll[0][0] = "changed"
copiedForEachAdd[0][0] = "changed"
copiedConstructWithSrc[0][0] = "changed"
copiedForEachAddCopyOf[0][0] = "changed"
println("Shallow copy")
println("Add all")
print("src: ")
src1.forEach { print(it.contentToString()) }
print("\ncopied: ")
copiedAddAll.forEach { print(it.contentToString()) }
println("\n\nFor each add")
print("src: ")
src2.forEach { print(it.contentToString()) }
print("\ncopied: ")
copiedForEachAdd.forEach { print(it.contentToString()) }
println("\n\nConstruct with src")
print("src: ")
src3.forEach { print(it.contentToString()) }
print("\ncopied: ")
copiedConstructWithSrc.forEach { print(it.contentToString()) }
println("\n\nDeep copy")
println("For each add copy of")
print("src: ")
src4.forEach { print(it.contentToString()) }
print("\ncopied: ")
copiedForEachAddCopyOf.forEach { print(it.contentToString()) }
}
각 경우 복사한 객체의 첫 번째 아이템을 수정했을 경우를 살펴 보았다.
Shallow copy
Add all
src: [changed, A][ICN, B][B, ICN]
copied: [changed, A][ICN, B][B, ICN]
For each add
src: [changed, A][ICN, B][B, ICN]
copied: [changed, A][ICN, B][B, ICN]
Construct with src
src: [changed, A][ICN, B][B, ICN]
copied: [changed, A][ICN, B][B, ICN]
Deep copy
For each add copy of
src: [ICN, A][ICN, B][B, ICN]
copied: [changed, A][ICN, B][B, ICN]
Process finished with exit code 0
이렇게 객체가 가진 아이템들의 경우 copyOf 등을 써서 별개의 객체를 만들어 추가해주어야 deepcopy가 된다. 원형타입을 비롯한 일부 class는 이렇게 안해줘도 deepcopy가 되는 듯 하다.