DataClass Copy시 주의할점

 

Class Copy를 진행할 경우에 주의할 점을 공유하고자 합니다. 

Class Copy를 하게 되면 클래스 내의 기본자료형과 레퍼런스형의 자료 간의 다른점이 있고, 그 점을 분명히 이해하면 더욱 Copy메서드를 잘 이용하실 수 있을거라 생각합니다.

 

 

예제

 

fun main () {
    val body1 = Body(head = Head())
    val body2 = Body(head = Head())

    println(body1 == body2)

    val body1Clone = body1.copy()

    println(body1 === body1Clone)
    println(body1.head === body1Clone.head)

    val body1CloneFinal = body1.copy(head = body1.head.copy())

    println(body1.head == body1CloneFinal.head)
    println(body1.head === body1CloneFinal.head)
}


data class Body(val head:Head)

data class Head(val eyes: Int = 2)

다음과 같은 코드에서 print문들은 어떤 값을 보여줄까요? 

 

아마 Copy를 했으니 body1 과 body1Clone 당연히 다른 메모리 위치를 가지고 있을것이라 생각할 수 있을것이지만, 

body 클래스 안에 있는 Head 클래스또한 달라질것이라 생각했습니다. 

 

하지만!

하지만 Head Class는 같은 메모리 주소를 공유하고 있네요! 

결과 값에서 3번째 true를 보시면 아실 수 있습니다.

 

 

즉, Copy를 하였지만 클래스 내부에서 참조하고 있는 다른 레퍼런스형 타입을 복사할때는 그 부분도 복사를 해주어야 합니다.

 

 val body1CloneFinal = body1.copy(head = body1.head.copy())

 

즉 이런식으로 copy시에 안에 존재하는 원소인 head에 body1 이 들고있던 head 를 다시 copy해주는 방식으로 copy를 해주어야 온전하게 모든 원소를 copy할 수 있습니다. 

 

 

728x90
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기