☕️ Java

[Java / Kotlin] 얕은 복사 , 깊은 복사

콩드로이드 2020. 12. 2. 23:01

 

객체의 복사를 크게 두 가지 얕은 복사(Shallow Copy), 깊은 복사(Deep Copy) 나눌 수가 있습니다.

혼동하여 사용할 경우 결과값이 달라지므로 차이를 알고 사용해야 합니다.

 

1. 얕은 복사 (Shallow Copy)

객체 복사 시 해당 객체의 주소값을 복사 

 

얕은 복사의 경우, 주소값을 복사하기 때문에 객체 복사 후 변수를 변경하거나 삭제하면 

기존 객체의 변수값에도 변화가 생긴다.

 

예시

배열에 들어간 값을 삭제하는지 테스트해보겠습니다

 

 

✔ Java

 

ArrayList<String> origin = new ArrayList<String>();
origin.add("AAA");
origin.add("BBB");

ArrayList<String> swallowCopy = new ArrayList<String>();
swallowCopy = origin;
swallowCopy.removeAt(1);


Log.d("Result", origin.size.toString())
// 1이 출력됨

 

 

✔ Kotlin

 

val origin = ArrayList<String>()
origin.add("AAA")
origin.add("BBB")

var swallowCopy = ArrayList<String>()
swallowCopy = origin
swallowCopy.removeAt(1)

Log.d("Result", origin.size.toString())

 

swallowCopy = origin (얕은 복사가 되는 부분)

' = '으로 단순 대입시킴으로써 swallowCopy 배열에서 변경한 값이 기존 객체에서도 변경됐음을 알 수 있습니다.

 

 

 

2. 깊은 복사 (Deep Copy)

얕은 복사와 달리 참조값의 복사가 아닌 객체 전체가 복사됨

 

깊은 복사의 경우, 객체 전체를 복사하기 때문에 복사한 객체가 변수값을 변경해도 기존 객체에 영향을 미치지 않습니다 

 

 

예시

마찬가지로 배열에 들어간 값을 삭제하는지 테스트해보겠습니다

 

 

✔ Java

 

ArrayList<String> origin = new ArrayList<String>();
origin.add("AAA");
origin.add("BBB");

ArrayList<String> swallowCopy = new ArrayList<String>();
swallowCopy.addAll(origin);
swallowCopy.removeAt(1);


Log.d("Result", origin.size.toString())
// 2이 출력됨

 

 

✔ Kotlin

 

val origin = ArrayList<String>()
origin.add("AAA")
origin.add("BBB")

var swallowCopy = ArrayList<String>()
swallowCopy.addAll(origin)
swallowCopy.removeAt(1)

Log.d("Result", origin.size.toString())

 

 

깊은 복사를 위해 Cloneable을 implements 하는 사용법도 있습니다.

해당 방법은 다음 포스팅에 이어서 쓰도록 하겠습니다.

 

 

 

 

궁금하신 점이나 의견이 있으시면 댓글 부탁드립니다 감사합니다 😊