서론

콜렉션의 깊은 복사를 하는 방법은 대표적으로 일급 컬렉션을 만들어서 방어적 복사를 구현하는 것


방어적 복사

생성자로 받은 가변 데이터들을 외부에서 변경하는 것을 막기 위해 복사본을 이용하는 방법

아래의 3가지를 수행해주어야 완벽한 방어적 복사가 될 수 있다.

  1. 일급 컬렉션 객체 내부에 들어오는 List에 대한 방어적 복사 수행하기
  2. 컬렉션의 내부 객체가 가변 객체라면 컬렉션 내부 객체에 대한 방어적 복사 수행하기
  3. 일급 컬렉션 객체 외부로 나가는 List에 대한 방어적 복사 수행하기

List에 대한 방어적 복사

import org.junit.jupiter.api.Test

class Car(val name: String = "", var position: Int = 0)

class Cars(val cars: List<Car>)

class DeepCopyTest {

    @Test
    fun listCopyTest() {
        val carList = mutableListOf(Car("carA"))
        val cars = Cars(carList) // carA, carB
        
        carList.add(Car("carB")) // carA, carB
    }
}

여기 또한 얕은 복사를 했기 때문에 carList.add 를 수행하면 cars 객체 또한 같이 바뀌게 된다.

class Cars(cars: List<Car>) {
    val cars: List<Car> = cars.toList()
}