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