JAVA

Shallow Copy & Deep Copy

jCurve 2021. 4. 13. 23:48
728x90
반응형

얕은복사와 깊은복사에 대해 알아봅시다. 

얕은 복사 

  • 한 쪽에서 수정이 발생되면 복사한 객체에도 영향을 준다.
    • 얕은 복사가 참조값을 복사하기 때문에 복사한 객체도 같은 참조값을 가지므로 수정이 반영되는 것

 

깊은 복사

  • 참조값을 복사하는 것이 아니라 , 원본 객체의 내부 객체의 값까지 복사해서 힙 영역에 객체를 새로 만드는 것으로 수정이 일어나도 원본과는 관계가 없다.

위의 클래스처럼 clone을 재정의한 클래스를 가지고 비교해보겠다. 

실행 결과를 보면 clone을 통해 복사한 객체가 얕은 복사라는 것을 알 수 있다. 

 

여기서 생각드는건 내가 객체를 복사할 때 대부분 원본에 복사본의 수정사항을 반영하고 싶을리가 없다는 거다. 

 

그렇다면 clone을 주의해서 재정의해보자.

 

 

이제 내부 참조값이 달라진 것을 볼 수 있다.

이처럼 객체 복사시에 의도적으로 얕은 복사를하거나 primitive 타입으로만 이루어진 필드를 가진 클래스를 복사하는 경우 혹은 배열에서의 clone사용이 아니라면 깊은 복사를 위해 위 코드 처럼 새로운 객체를 메모리 공간에 할당하고 원본 값을 전부 대입하여 return해주어야 한다. 

 

이 깊은 복사 방식 또한 복사 생성자 방식과 복사 팩터리 방식이 있다.

 

복사 생성자 (복사 팩터리는 이걸 팩터리 메서드로 바꾸기만 하면된다)

 

이렇게 생성자를 사용해서 깊은 복사도 가능합니닷

반응형
댓글수0