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(깊은 복사)

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();
}