확인하게 된 계기
깊은복사 vs 얕은복사
얕은복사
call-by-reference 와 유사한 개념이다.
복사 객체가 원본 객체에 종속적이다.
원본 객체가 수정되는 경우 복사 객체가 원본 객체와 동일하게 변동이 생긴다.
예시
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import org.junit.Test;
public class CopyTest {
@Test
public void shallowCopy() {
CopyObject obj = new CopyObject(30, "euni");
CopyObject obj2 = obj;
System.out.println("obj value : " + obj.getName() + " -> " + obj.getIdx());
System.out.println("obj2 value : " + obj2.getName() + " -> " + obj2.getIdx());
obj2.setIdx(40);
obj2.setName("euni2");
System.out.println("obj value : " + obj.getName() + " -> " + obj.getIdx());
System.out.println("obj2 value : " + obj2.getName() + " -> " + obj2.getIdx());
}
}
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
class CopyObject {
private int idx;
private String name;
}
결과는??
메모리 구조 (블로그 참조)
stack 영역에 기존 object 와 복사한 object 가 있고, heap 영역에서 두 개의 object 가 참조하는 데이터는 같다.
→ 따라서 두 개의 object 주소는 같다.
깊은 복사
Cloneable 인터페이스 구현 (블로그 참조)
public class CopyObject implements Cloneable {
private String name;
private int age;
public CopyObject() {
}
public CopyObject(String name, int age) {
this.name = name;
this.age = age;
}
**@Override
protected CopyObject clone() throws CloneNotSupportedException {
return (CopyObject) super.clone();
}**
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;
}
}
복사 팩토리 (블로그 참조)
public class CopyObject {
private String name;
private int age;
public CopyObject() {
}
public CopyObject(CopyObject original) {
this.name = original.name;
this.age = original.age;
}
/* 복사 팩터리 */
**public static CopyObject copy(CopyObject original) {
CopyObject copy = new CopyObject();
copy.name = original.name;
copy.age = original.age;
return copy;
}**
public CopyObject(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;
}
}
@Test
void shallowCopy() {
CopyObject original = new CopyObject("JuHyun", 20);
CopyObject copyConstructor = new CopyObject(original);
**CopyObject copyFactory = CopyObject.copy(original);**
copyConstructor.setName("JuBal");
copyFactory.setName("BalJu");
System.out.println(original.getName());
System.out.println(copyConstructor.getName());
System.out.println(copyFactory.getName());
}