[Kotlin] Deep copy, Shallow copy(Array, ArrayList)

이상헌·2020년 9월 8일

Kotlin

목록 보기
1/1
post-thumbnail

알고리즘 풀다가 얕은 복사와 깊은 복사 구분이 안되서 기록해 본다.

  1. addAll 로 원본의 아이템들을 새로 만든 객체에 추가할 경우
  2. forEach와 add 로 원본의 아이템들을 새로 만든 객체에 추가할 경우
  3. src3을 새로 만드는 객체의 생성자에 넘겨줄 경우
  4. forEach, add 와 copyOf 로 원본의 아이템들을 새로 만들어 새로 만드는 객체에 추가할 경우

코드

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가 되는 듯 하다.

profile
배고픈 개발자 sayi입니다!

0개의 댓글