Java

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

Hyung1 2021. 1. 19. 12:58
728x90
반응형

 

얕은 복사(Shallow Copy)

한 쪽에서 수정이 발생되면, 다른쪽에도 영향을 끼쳐 같아지게 된다.

  • 객체를 복사할 시, 해당 객체만 복사하여 새 객체를 생성.
  • 복사된 객체의 인스턴스 변수는 원본 객체의 인스턴스 변수와 같은 메모리 주소를 참조.
  • 따라서, 해당 메모리의 주소의 값이 변경되면 원본 객체와 복사된 객체의 인스턴스 변수 값도 같이 변경 됨.
public static void main(String[] args) {

        List<Integer> first = new ArrayList<>();
        first.add(0);
        first.add(1);
        first.add(2);

        List<Integer> second  = first;

        first.add(3);

        System.out.println(second.toString());
    }

 

위 작성한 에제 코드는 '얕은 복사'로, 참조의 의한 복사가 이루어졌기 때문에 동일한 주소 값을 가지는 first와 second 모두 값이 변경되는 것이다. [0, 1, 2] 를 출력하기 위해서는 아래와 같이 코드를 작성하면 된다.

깊은  복사(Deep Copy)

깊은 복사는 주소 값을 참조하는 것이 아닌, 새로운 메모리 공간에 값을 복사하는 것이기 때문에 배열이 변경되어도 복사된 배열에는 전혀 상관이 없다.

  • 객체를 복사할 때, 해당 객체와 인스턴스 변수까지 복사하는 방식
  • 전부를 복사하여 새 주소에 담기 때문에 참조를 공유하지 않는다.
    public static void main(String[] args) {

        List<Integer> first = new ArrayList<>();
        first.add(0);
        first.add(1);
        first.add(2);
        
        List<Integer> second = new ArrayList<>();
        for (Integer i : first) {
            second.add(i);
        }
        // second.addAll(first);
        first.add(3);
        System.out.println(second.toString());
    }

]

728x90
반응형