///////
Search
📌

Shallow Copy와 Deep Copy의 차이는 무엇인가요? 자바에서 Deep Copy를 하기 위해서는 무엇을 사용하여야 하나요?

얕은 복사(Shallow Copy)

복사하려는 원본 객체에 대해 새로운 단일/복합 객체를 만들고 원본 객체를 참조한다
객체의 인스턴스가 생성될 때 인스턴스화 되며 메모리에 할당된 주소의 값을 참조
복사 객체가 원본 객체에 종속적
객체를 복사할 때, 객체가 갖고있는 필드의 값을 단순히 복사
기본 타입(Primitive Type)은 값이 복사가 되고, 참조형 변수는 같은 객체를 가리킨다
Call By Reference와 유사한 개념

예제

Person class

public class Person { String name; int age; public Person(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
Java
복사

shallow copy

void shallowCopy() { Person person = new Person("아무개", 25); Person copyPerson = person; copyPerson.setName("어배추고양이"); copyPerson.setAge(26); }
Java
복사

Person 출력 결과

어배추고양이, 26 // System.out.println(person); 어배추고양이, 26 // System.out.println(copyPerson);
Java
복사

메모리 공간

person이 참고하고 있는 값을 복사
copyPerson을 수정하면 Person도 수정된다

깊은 복사(Deep Copy)

복사하려는 원본 객체에 대해 새로운 단일/복합 객체를 만들고 원본 객체로부터 독립적인 객체를 생성한다
새로운 객체가 원본 객체 자체를 복사
Call By Value와 유사한 개념
Java에서 깊은 복사를 구현하는 방법
복사 생성자 / 복사 팩토리를 이용해 복사
직접 객체를 생성하여 복사
Clonable 인터페이스를 구현해 clone() 함수를 오버라이딩 해 복사
객체가 불변의 성질을 갖고있다면 깊은 복사를 할 필요없다

예제 1

복사 방법

// 복사 생성자 public Person(Person person) { this.name = person.name; this.age = person.age; } // 복사 팩토리 public static Person copyFactory(Person person) { Person copyPerson = new Person(person.name, person.age); return copyPerson; } // 직접 객체 생성 복사 void deepCopy() { Person person = new Person("아무개", 25); Person copyPerson = new Person(person.getName(), person.getAge()); copyPerson.setName("어배추고양이"); copyPerson.setAge(26); }
Java
복사

Person 출력 결과

아무개, 25 // System.out.println(person); 어배추고양이, 26 // System.out.println(copyPerson);
Java
복사

메모리 공간

다른 메모리 영역으로 객체의 내용을 모두 복사한다

예제 2

배열의 깊은 복사

public class Deep_array { public static void main(String[] args) { int arr1[] = {5, 4, 3, 2, 1}; int arr2[] = arr1.clone(); System.out.println(arr1.toString()); System.out.println(arr2.toString()); } }
Java
복사
clone() 메서드를 이용한 객체 복사
arr1 , arr2 에 할당된 메모리 주소는 다르게 나온다.

얕은 복사, 깊은 복사의 장단점

얕은 복사
깊은 복사
장점
- 빠르고 간결
- 다형성을 부여하여 사용하거나 재정의 할 수 있다 - 데이터를 안전하게 처리할 수 있다.
단점
- 원본 객체에 종속적이다 - 원본 객체가 수정되는 경우 복사 객체가 원본 객체와 동일하게 바뀐다
- 모든 인스턴스 값을 갖고오기 때문에 얕은 복사에 비해서 상대적으로 느리고 복잡하다