記錄

Prototype Pattern(프로토 타입 패턴) - 2 본문

IT_Fundamental/디자인 패턴

Prototype Pattern(프로토 타입 패턴) - 2

surhommejk 2017. 12. 7. 16:27


얕은 복사와 깊은 복사의 차이를 알아보자






얕은 복사로 인해 주소값이 공유 되고 결과적으로 수정을 원하지 않는 객체까지 수정이 되어버림







 주소값이 같은 것을 확인 할 수 있다







깊은 복사로 제대로된 결과가 출력됨









package Prototype;

public class Cat implements Cloneable {

    private String name;
    private int age;

    public Cat(String name, int age) {
        super();
        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;
    }

    public Cat copy() throws CloneNotSupportedException {

        Cat ca = (Cat) clone();
        return ca;
    }

}





package Prototype;

public class Main {

    public static void main(String[] args) throws CloneNotSupportedException {

        Cat cat1 = new Cat("navi", 10);
        Cat cat2 = cat1;

        cat2.setName("yo");
        cat2.setAge(5);

        System.out.println(cat1.getName()); // yo <--navi가 나왔어야 하는데 yo가 나옴
        System.out.println(cat1.getAge()); // 5 <--10이 나왔어야 하는데 5가 나옴
        System.out.println(cat2.getName()); // yo
        System.out.println(cat2.getAge()); // 5

        // 이 모든건 얕은 복사가 이뤄졌기 때문이다. 따라서 깊은 복사를 통해 바꾸도록 한다.

        Cat cat3 = new Cat("siroo", 5);
        Cat cat4 = cat3.copy(); // cat에 내장된 copy로 깊은 복사 실행

        cat4.setName("naru");
        cat4.setAge(10);

        System.out.println(cat3.getName()); // siroo
        System.out.println(cat3.getAge()); // 5
        System.out.println(cat4.getName()); // naru
        System.out.println(cat4.getAge()); // 10

    
        //  왜 굳이 '복사'를 하는가? 위에서 cat2, cat4가 필요할 때 그냥 새로 정의해주면
        //  되지 않나? 하는 의문이 생겼다. 하지만 강의에서 이에 대해 대답하고 있다..
        //  바로 밑에 빨간색 글씨로 정리
        
        
    } // main end

} // class end



※ 왜 객체를 새로 안만들고 굳이 복사를 하는가?


앞서 Circle도 그렇고 이번 Cat도 그렇고 데이터의 종류가 굉장히 적지만 데이터가 엄청 많아졌을 때 일부만 수정하고 싶을때는 새로 만들기 보다는 복사를 해서 일부를 수정하는 것이 더 편하기 때문에 clone()을 활용하는 것!

Comments