Java - Shallow Copy vs Deep Copy


Primitive Type Copy

  • 원시 타입의 복사는 다음과 같은 결과가 나온다.

      int a = 100;
      int b = a;
    	
      a = 1;
    	
      System.out.println(a) // 1
      System.out.println(b) // 100
    
  • 원시타입은 Stack 메모리에 값이 직접 저장된다.



Reference Type Copy

  • 참조 타입 복사는 다음과 같은 결과가 나온다.

      int[] a = {1, 2, 3, 4, 5};
      int[] b = a;
    	
      a[0] = 100;
    	
      System.out.println(Arrays.toString(a)) // [100, 2, 3, 4, 5]
      System.out.println(Arrays.toString(b)) // [100, 2, 3, 4, 5]
    
  • 참조타입은 주소만 Stack 에 저장되고, 실제 값은 Heap 에 저장된다.

  • 그래서 위 코드처럼 복사를 하면, 주소값을 복사하는거기 때문에 같은 Heap 의 값을 바라보게 된다.

  • 그걸 얕은 복사 라고 이야기한다.



Shallow Copy

  • 얕은 복사

  • 객체를 그냥 = 으로 복사하는 개념으로, 동등이 아닌 동일하게 복사를 한다. ( 객체 주소 자체를 복사해서 옮김 )

      TestClass a = new TestClass();
      TestClass b = new TestClass();
      a = b;
    
  • 이렇게 할 시, a == b를 하면 true가 나온다.

  • 재정의 하지 않은 clone();을 사용하거나, = 을 통하여 복사한 경우 이렇게 얕은 복사가 일어난다.



Deep Copy

  • 깊은 복사

  • Cloneable 인터페이스를 implement 한 후, clone( )을 재정의하거나

  • 새 메모리를 생성하여 값들을 하나하나 옮기거나 직렬화 역직렬화를 통해 Deep Copy를 수행할 수 있다.

  • 객체 주소는 복사하지 않되, 내용은 그대로 복사하는 방법을 말한다.






results matching ""

    No results matching ""