본문 바로가기

프로그래밍 언어/Kotlin

[Kotlin] 배열과 리스트 복사

코딩을 하다보면 배열 또는 리스트를 복사해야할 일이 생긴다.

 

기존의 배열은 그대로 두고 새로운 배열을 만들어 데이터 변경을 해야하기 때문이다.

 

복사에는 두 가지 복사가 있다.

 

1. 얕은 복사

2. 깊은 복사

 

얕은 복사

얕은 복사란 주소값이 복사된 것을 말한다.

쉽게 말하자면 변수명만 다르고 내용물은 같은 경우이다.

val list = Array(3, {0}) // [0, 0, 0]
val list2 = list

 

위와 같은 경우 list2의 값을 변경하면 list도 같이 변한다.

val list = Array(3, {0}) // [0, 0, 0]
val list2 = list

list2[0] = 1

println(list[0]) // 1

 

이는 ArrayList, List 모두 같다.

 

우리가 알고 싶은건 깊은복사

 

깊은복사

기존에 있던 배열을 그대로 복사하여 새로운 배열을 만드는 것이다.

이때 각각의 배열은 서로 주소값이 다른 별개의 배열이 된다.

 

Array의 깊은 복사

val array = Array(3, {0})
val copyArray = array.copyOf()
val copyArray2 = array.clone()

 

Array는 copyOf()와 clone()으로 깊은 복사가 가능하다.

 

ArrayList와 List의 깊은 복사

val arrayList = arrayListOf(0,0,0)
val copyList = ArrayList<Int>()

println("ArrayList : $arrayList")
copyList.addAll(arrayList)
println("CopyList: $copyList \n")

copyList.add(1)
println("ArrayList : $arrayList")
println("CopyList: $copyList")

-------------------------------------
ArrayList : [0, 0, 0]
CopyList: [0, 0, 0] 

ArrayList : [0, 0, 0]
CopyList: [0, 0, 0, 1]

 

ArrayList와 List에서는 copyOf(), clone() 을 써도 얕은 복사가 된다.

따라서 ArrayList에서는 addAll() 을 사용하여 깊은 복사가 가능하다.

 

List의 깊은 복사 또한 마찬가지

val List = mutableListOf(0,0,0)
val copyList = mutableListOf<Int>()

println("List : $List")
copyList.addAll(List)
println("CopyList: $copyList \n")

copyList.add(1)
copyList[0] = 3
println("List : $List")
println("CopyList: $copyList")

-------------------------------------

List : [0, 0, 0]
CopyList: [0, 0, 0] 

List : [0, 0, 0]
CopyList: [3, 0, 0, 1]

 

 

2차원 배열의 깊은 복사

2차원 배열, 리스트의 경우 위에서의 방법이 통하지 않는다.

모두 얕은 복사만 될뿐

 

방법은 다음과 같다.

 

Array

val array = arrayOf(
    intArrayOf(0, 0),
    intArrayOf(0, 0)
)

val copyArray = Array(array.size){idx-> array[idx].copyOf()}

copyArray[0][0] = 5

println("Array")
for (arr in array) {
    for (num in arr) print("$num ")
    println()
}

println("CopyArray")
for (arr in copyArray) {
    for (num in arr) print("$num ")
    println()
}

------------------------------------------------------
Array
0 0 
0 0 
CopyArray
5 0 
0 0

 

 

List

val List = mutableListOf(mutableListOf(0, 0))
val copyList = mutableListOf<MutableList<Int>>()

println("List : $List")
for(i in List.indices){
    val l = mutableListOf<Int>().apply{ addAll(List[i]) }
    copyList.add(l)
}
println("CopyList: $copyList \n")

copyList[0][1] = 5
println("List : $List")
println("CopyList: $copyList \n")

-------------------------------------------
List : [[0, 0]]
CopyList: [[0, 0]] 

List : [[0, 0]]
CopyList: [[0, 5]]

 

'프로그래밍 언어 > Kotlin' 카테고리의 다른 글

[Kotlin] 정렬  (0) 2024.06.11
[Kotlin] 문자열 String  (0) 2023.11.03
[Kotlin] 코틀린 기초 문법  (1) 2023.11.03