▩목 차▩
1. 의문점 및 해결
1. 의문점 해결
// 코드
val chunkList = mutableListOf<MutableList<Int>>()
for((index,value) in list.withIndex()) {
val lastChunk = chunkList.lastOrNull()
if (lastChunk == null || lastChunk.count() == size) {
chunkList.add(mutableListOf(value))
} else {
println()
chunkList.forEachIndexed { index2, it -> print("|for문 인덱스($index),값 추가 전 인덱스($index2)| ")
it.forEach { print(" $it ")
}}
println()
lastChunk.add(value)
chunkList.forEachIndexed { index3, it -> print("|for문 인덱스($index), 값 추가 후 인덱스($index3)| ")
it.forEach { print(" $it ")
}}
println()
println("@@@@@@@@@@@@@@@@@@@@@@")
}
}
// 결과값
//실행코드 : splitChunk(mutableListOf(1, 2, 3, 4), 2)
/**
|for문 인덱스(1),값 추가 전 인덱스(0)| 1
|for문 인덱스(1), 값 추가 후 인덱스(0)| 1 2
@@@@@@@@@@@@@@@@@@@@@@
|for문 인덱스(3),값 추가 전 인덱스(0)| 1 2 |for문 인덱스(3),값 추가 전 인덱스(1)| 3
|for문 인덱스(3), 값 추가 후 인덱스(0)| 1 2 |for문 인덱스(3), 값 추가 후 인덱스(1)| 3 4
@@@@@@@@@@@@@@@@@@@@@@
*/
[의문점]
나는 깊은 복사라고 생각해서 else 부분에서 add를 하더라도 깊이 복사되었기 때문에 새로 생성된 값(주소 새로 생성) 이라고 생각했지만,
사실은 얕은 복사(주소를 공유)였기 때문에 lastChunk에 값을 추가하더라도 chunkList에 값이 추가된 것이 맞을까?
[해결]
코틀린에서는 기본적으로 '='을 사용해서 다른 인스턴스를 넣어주면 얕은 복사가 수행된다.
즉, 얕은 복사 때문이 맞다.
그렇기 때문에 얕은 복사가 이루어지면 원본 데이터도 함께 바뀔 위험이 있기 때문에 주의해야한다!
얕은 복사와 관련해서는 data class의 copy를 공부해보면 좋을 것이다. (추후 data class의 copy도 다뤄보도록 하겠다.)
( +data class의 copy 추가 : https://bj-turtle.tistory.com/117 )
[코드]
'Kotlin > 궁금한 점 의문 해결' 카테고리의 다른 글
data class의 얕은복사, 깊은복사 의문점 해결 (0) | 2023.03.13 |
---|---|
StringBuilder의 값 비교(==)와 주소값 비교(===)에 대한 의문점 해결 (0) | 2023.03.13 |