Shallow copy(얕은 복사) & Deep copy(깊은 복사)
- 얕은 복사는 주소 값을 복사 (참조하고 있는 실제 값은 같다)
- 깊은 복사는 실제 값을 새로운 메모리 공간에 복사 (실제 값이 다르다)
예제
public class Person {
String name;
int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public void changeName(String name) {
this.name = name;
}
public void old(int age) {
this.age = age;
}
}
Shallow copy(얕은 복사)
@Test
void shallowCopy() {
Person person = new Person("jack", 25);
Person personCopy = person;
person.changeName("poll");
person.old(29);
System.out.println(person); // Person{name='poll', age=29}
System.out.println(personCopy); // Person{name='poll', age=29}
}
Deep copy(깊은 복사)
- 깊은 복사를 구현하는 3가지 방법
- 복사 생성자 또는 복사 팩터리를 이용하여 복사
- 직접 객체 생성하여 복사
- Cloneable을 구현하여 clone() 재정의
- final instance 또는 array가 아닌 경우 사용을 권장하지 않음
1. 복사 생성자 or 복사 팩터리
public class Person {
String name;
int age;
...
// 복사 생성자
public Person(Pserson person) {
this.name = person.name;
this.age = person.age;
}
// 복사 팩터리
public static Person newInstance(Person person) {
Person p = new Person();
p.name = person.name;
p.age = person.age;
return p;
}
}
2. 직접 객체를 생성하여 복사
@Test
void deepCopy() {
Person person = new Person("jack", 25);
Person personCopy = new Person();
personCopy.setName(person.getName());
personCopy.setAge(person.getAge());
}
3. Cloneable을 구현하여 clone() 재정의
public class Person implements Cloneable{
String name;
int age;
...
@Override
protected Person clone() throws CloneNotSupportedException {
return (Person) super.clone();
}
}
@Test
void deepCopy() throws CloneNotSupportedException {
Person person = new Person("jack", 25);
Person personCopy = person.clone();
}