깊은 복사, 얕은 복사

basic

깊은복사, 얕은 복사

public class Main {
    public static void main(String[] args) {
        Cat navi = new Cat();
        navi.setName("navi");

        Cat yo = navi;
        yo.setName("yo");

        System.out.println(navi.getName());
        System.out.println(yo.getName());
    }
}


public class Cat {
    private String name;

    public String getName() {
        return name;
    }

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


위와 같이 할 경우 낮은 수준의 복사(얕은 복사)가 되어 navi와 yo의 주소값이 똑같다.

깊은 복사의 경우(아래의 경우)는 값 자체가 복사되는 것이고 서로 다른 객체를 뜻한다.

public class Main {
    public static void main(String[] args) throws CloneNotSupportedException {
        Cat navi = new Cat();
        navi.setName("navi");

        Cat yo = navi.copy();
        yo.setName("yo");

        System.out.println(navi.getName());
        System.out.println(yo.getName());
    }
}

public class Cat implements Cloneable{
    private String name;

    public String getName() {
        return name;
    }

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

    public Cat copy() throws CloneNotSupportedException {
        Cat ret = (Cat)this.clone();
        return ret;
    }
}

Cat 클래스에 copy가 추가되었다.

public class Main {
    public static void main(String[] args) throws CloneNotSupportedException {
        Cat navi = new Cat();
        navi.setName("navi");
        navi.setAge(new Age(2017,3));
        navi.getAge().setYear(2017);
        navi.getAge().setValue(3);

        Cat yo = navi.copy();
        yo.setName("yo");
        yo.getAge().setYear(2018);
        yo.getAge().setValue(2);


        System.out.println(navi.getName());
        System.out.println(yo.getName());

        System.out.println(navi.getAge().getYear());
        System.out.println(yo.getAge().getYear());

        System.out.println(navi.getAge().getValue());
        System.out.println(yo.getAge().getValue());
    }
}

public class Age {

    int year;
    int value;

    public Age(int year, int value) {
        this.year = year;
        this.value = value;
    }

    public int getYear() {
        return year;
    }

    public void setYear(int year) {
        this.year = year;
    }

    public int getValue() {
        return value;
    }

    public void setValue(int value) {
        this.value = value;
    }
}


public class Cat implements Cloneable{
    private String name;
    private Age age;

    public Age getAge() {
        return age;
    }

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

    public String getName() {
        return name;
    }

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

    public Cat copy() throws CloneNotSupportedException {
        Cat ret = (Cat)this.clone();
        return ret;
    }
}


위와 같이 Age클래스로 나이를 나타낼경우엔 생각한대로 결과가 나오지 않게 된다.

public Cat copy() throws CloneNotSupportedException {
        Cat ret = (Cat)this.clone();
        ret.setAge(new Age(this.age.getYear(), this.age.getValue()));
        return ret;
    }

위처럼 age도 깊은 복사를 해주어야 원하는 대로 결과가 나오게 된다.

효준's profile image

효준

2019-05-07 14:00

다른글 보러가기

프로토타입 패턴(Prototype Pattern)

이전 포스트

빌더 패턴(Builder Pattern) - 1

다음 포스트