[kotlin] 배열의 얕은 복사와 깊은 복사의 차이는?

배열은 여러 개의 값들을 하나의 변수에 저장하는 자료 구조입니다. 때때로 배열을 복사해야 할 수도 있습니다. 이때, 배열의 얕은 복사와 깊은 복사는 두 가지 다른 복사 방법입니다.

얕은 복사 (Shallow Copy)

얕은 복사는 원본 배열과 복사된 배열이 같은 메모리를 참조하는 방식입니다. 즉, 두 배열은 동일한 데이터를 가리키고 있기 때문에 하나의 배열을 변경하면 다른 배열도 영향을 받습니다. 즉, 원본 배열과 복사본 배열은 같은 객체를 참조하고 있습니다.

val originalArray = arrayOf(1, 2, 3, 4, 5)
val shallowCopy = originalArray

originalArray[0] = 10
println(originalArray.contentToString()) // [10, 2, 3, 4, 5]
println(shallowCopy.contentToString()) // [10, 2, 3, 4, 5]

위의 예제에서 originalArray를 변경하면 shallowCopy도 같이 변경되는 것을 볼 수 있습니다. 이는 얕은 복사로 인해 두 배열이 같은 메모리를 참조하고 있기 때문입니다.

깊은 복사 (Deep Copy)

깊은 복사는 원본 배열과 독립적인 메모리 공간을 가지는 복사본 배열을 생성하는 방식입니다. 즉, 두 배열은 서로 다른 데이터를 가리키고 있기 때문에 한 배열을 변경해도 다른 배열에는 영향을 주지 않습니다.

val originalArray = arrayOf(1, 2, 3, 4, 5)
val deepCopy = originalArray.copyOf()

originalArray[0] = 10
println(originalArray.contentToString()) // [10, 2, 3, 4, 5]
println(deepCopy.contentToString()) // [1, 2, 3, 4, 5]

위의 예제에서 originalArray를 변경해도 deepCopy은 변경되지 않음을 확인할 수 있습니다. 이는 깊은 복사를 통해 서로 다른 메모리를 가지는 두 배열을 생성했기 때문입니다.

얕은 복사와 깊은 복사는 배열의 사용 목적에 따라 적절한 방법을 선택해야 합니다. 얇은 복사는 메모리를 더 효율적으로 사용할 수 있지만, 원본 배열이 변경되면 복사본 배열도 변경되는 문제가 발생할 수 있습니다. 깊은 복사는 복사본 배열이 원본 배열과 독립적인 데이터를 가지기 때문에 불필요한 변경을 방지할 수 있습니다.

더 많은 정보를 원한다면, 다음 문서를 참조해 볼 수 있습니다.