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()을 활용하는 것!