Having

[JAVA] ArrayList 얕은복사, 깊은복사 본문

JAVA

[JAVA] ArrayList 얕은복사, 깊은복사

GHM 2022. 12. 27. 03:00

얕은 복사(Shallow copy)

: 다른 객체에 원본 객체의 주소값을 복사해 할당하는 것

public static void main(String[] args) {

    ArrayList<String> list = new ArrayList<>();  // initialCapacity : 10
    list.add("original obj");

    ArrayList<String> list2 = list;  // Shallow copy
    list2.add("copy obj");

    // 원본 객체 출력
    System.out.println(list.toString()); // [original obj, copy obj]
    // 사본 객체 출력
    System.out.println(list2.toString()); // [original obj, copy obj]
}
  • 같은 원본 객체를 참조한다.
  • 원본과 사본이 완벽하게 동기화된다.
  • 사본 객체의 인스턴스 변수의 값을 수정하면, 원본 객체에도 영향을 끼쳐 같이 수정된다

 

깊은 복사(Deep copy)

: 객체의 모든 값을 새로운 메모리 공간에 복사하는 것

 

1. 생성자를 통한 Deep copy

public static void main(String[] args) {

    ArrayList<Integer> list = new ArrayList<>();  // initialCapacity : 10
    list.add(new Integer(0));

    ArrayList<Integer> list2 = new ArrayList<>(list);  // Deep copy
    list2.add(new Integer(1));
    list2.add(new Integer(2));

    // 원본 객체 출력
    System.out.println(list.toString()); // [0]
    // 사본 객체 출력
    System.out.println(list2.toString()); // [0,1,2]
}

 

2. addAll 메서드를 통한 Deep copy

public static void main(String[] args) {

    ArrayList<Integer> list = new ArrayList<>();  // initialCapacity : 10
    list.add(new Integer(0));
    list2.add(new Integer(1));
    list2.add(new Integer(2));

    ArrayList<Integer> list2 = new ArrayList<>();  
    list2.addAll(list);  // Deep copy
    list2.add(new Integer(3));

    // 원본 객체 출력
    System.out.println(list.toString()); // [0,1,2]
    // 사본 객체 출력
    System.out.println(list2.toString()); // [0,1,2,3]
}
  • 원본 객체의 모든 값을 복사해 새로운 객체를 생성한다.
  • 사본 객체에 있는 값을 변경해도, 원본 객체에 영향을 끼치지 않는다.