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
최근댓글