Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 웹소켓
- 웹게임
- tiles.xml
- phaser
- jQuery
- model1
- 암호화
- 도커
- SQL
- Spring
- docker
- RDS
- Ajax
- Cookie
- Servlet
- autowired
- node.js
- JavaScript
- HTML
- PL/SQL
- 알고리즘
- 블록체인
- CSS
- 배포
- express
- 비트코인
- EC2
- AWS
- websocket
- JSP
Archives
- Today
- Total
記錄
Prototype Pattern(프로토 타입 패턴) - 2 본문
얕은 복사와 깊은 복사의 차이를 알아보자
얕은 복사로 인해 주소값이 공유 되고 결과적으로 수정을 원하지 않는 객체까지 수정이 되어버림
주소값이 같은 것을 확인 할 수 있다
깊은 복사로 제대로된 결과가 출력됨
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()을 활용하는 것!
'IT_Fundamental > 디자인 패턴' 카테고리의 다른 글
Abstract Factory Pattern(추상 팩토리 패턴) (0) | 2018.02.12 |
---|---|
Builder Pattern(빌더패턴) (0) | 2017.12.11 |
Prototype Pattern(프로토 타입 패턴) - 1 (0) | 2017.12.07 |
Singleton Pattern(싱글톤 패턴) (0) | 2017.11.23 |
Factory Method Pattern(팩토리 메소드 패턴) (0) | 2017.11.19 |
Comments