티스토리 뷰

자바 깊은 복사(Deep Copy) 얕은 복사(Shallow Copy) 비교

코딩을 하다보면 깊은복사 얕은복사에 대한 내용은 많이 접하셨을 겁니다.
간단하고 기본적인 내용이지만 종종 헷갈린 경우도 있을건데요.
오늘은 깊은 복사 얕은복사에 차이에 대해서 알아보겠습니다.

  • 깊은복사
  1. 객체를 복사시 객체가 가지고 있는 값을 새로운 메모리에 복사합니다.
  • 얕은복사
  1. 객체를 복사시 객체가 가지고 있는 값을 복사하는 것이 아니라 객체의 주소값을 복사합니다.
public class CopyObject implements Cloneable {
    private String name;
    private int age;
    private LocalDate birth;

    public CopyObject(String name, int age, LocalDate birth) {
        this.name = name;
        this.age = age;
        this.birth = birth;
    }

    @Override
    protected CopyObject clone() throws CloneNotSupportedException {
        return (CopyObject) super.clone();
    }

    public String getName() {
        return this.name;
    }

    public int getAge() {
        return this.age;
    }

    public LocalDate getBirth() {
        return this.birth;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public void setBirth(LocalDate birth) {
        this.birth = birth;
    }

}
public class CopyExample {
    public static void main(String[] args) {
        String name = "Hong";
        int age = 22;
        LocalDate birth = LocalDate.of(2000, 1, 1);
        int changeAge = 32;

        // 얕은 복사
        CopyObject shallowOriginal = new CopyObject(name, age, birth);
        CopyObject shallowCopy = shallowOriginal;
        shallowCopy.setAge(changeAge);

        int shallowOriginalAge = shallowOriginal.getAge();
        int shallowCopyAge = shallowCopy.getAge();
        System.out.println("shallow original age : " + shallowOriginalAge);
        System.out.println("shallow copy age : " + shallowCopyAge);

        // 깊은 복사1 직접 복사
        CopyObject deepOriginal1 = new CopyObject(name, age, birth);
        CopyObject deepCopy1 = new CopyObject(
            deepOriginal1.getName(),
            deepOriginal1.getAge(),
            deepOriginal1.getBirth());
        deepCopy1.setAge(changeAge);

        int deepOriginalAge1 = deepOriginal1.getAge();
        int deepCopyAge1 = deepCopy1.getAge();
        System.out.println("deep original1 age : " + deepOriginalAge1);
        System.out.println("deep copy1 age : " + deepCopyAge1);

        // 깊은 복사2 Cloneable 이용
        CopyObject deepOriginal2 = new CopyObject(name, age, birth);
        CopyObject deepCopy2 = deepOriginal2.clone();
        deepCopy2.setAge(changeAge);

        int deepOriginalAge2 = deepOriginal2.getAge();
        int deepCopyAge2 = deepCopy2.getAge();
        System.out.println("deep original2 age : " + deepOriginalAge2);
        System.out.println("deep copy2 age : " + deepCopyAge2);
    }
}

감사합니다.

댓글