[코드 수정문제] kotlin입니다. 이 코드 수정을 어떻게 해야되죠?

조회수 49회
class Snapshot<T>(private val array:MutableList<T>) {

    fun restore():MutableList<T> {
        return array
    }    
}

fun test2(){
    var array = mutableListOf(1,2)
    val snap = Snapshot(array)
    array[0] = 1
    array = snap.restore()
    println(array.toList().joinToString()) //It should log "1,2"
    array.add(4)
    array = snap.restore()
    println(array.toList().joinToString()) //It should log "1,2"
}

fun main(str: Array<String>) {
    test2()
}

//현재상태 output:
1, 2
1, 2, 4

//정상 output:
1,2
1,2

2 답변

  • 좋아요

    2

    싫어요
    채택 취소하기

    자문자답입니다.

    class Snapshot<T>(private val array: MutableList<T>) {
        var deepCopyArray:MutableList<T> = ArrayList()
    
        init {
            deepCopyArray.addAll(array)
        }
    
        fun restore():MutableList<T> {
            array.clear()
            array.addAll(deepCopyArray)
            return array
        }
    }
    fun test2(){
        var array = mutableListOf(1,2)
        val snap = Snapshot(array)
        array[0] = 1
        array = snap.restore()
        println(array.toList().joinToString()) //It should log "1,2"
        array.add(4)
        array = snap.restore()
        println(array.toList().joinToString()) //It should log "1,2"
    }
    
    fun main(str: Array<String>) {
        test2()
    }
    
    //현재상태 output:
    1, 2
    1, 2
    
    //정상 output:
    1, 2
    1, 2
    
    • 코틀린은 fp(함수형 프로그래밍) 를 지원하는 언어입니다. 위의 코드는 좋은 코드라고 하기 어렵습니다. immutable list 를 사용하여 컬렉션이 변경되는 것을 방지해야 합니다. 그래야 변경불가능한 데이터와 순수함수를 이용한 fp 를 할 수 있기 때문입니다. 정영훈 2020.2.7 16:05
  • MutableList 이고 add(4) 를 했으니 1,2,4 가 나오는 것이 정상입니다.

    왜 1,2,4 가 되는지 이해하는 것이 더 중요합니다.

    코틀린에서는 컬렉션에 대해 변경가능한 타입과 불가능한 타입이 나뉘어져 있습니다.

    기본적으로 사용하는 list 는 변경불가형이나 명시적으로 MutableList 을 사용했기 때문에 add 가 되는 겁니다.

답변을 하려면 로그인이 필요합니다.

Hashcode는 개발자들을 위한 무료 QnA 사이트입니다. 계정을 생성하셔야만 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)

ᕕ( ᐛ )ᕗ
로그인이 필요합니다

Hashcode는 개발자들을 위한 무료 QnA사이트 입니다. 계정을 생성하셔야만 글을 작성하실 수 있습니다.