package sec03.exam04_clone;
public class Member implements Cloneable {
private String id;
private String name;
private String password;
private int age;
private boolean adult;
public Member(String id, String name, String password, int age, boolean adult) {
this.id = id;
this.name = name;
this.password = password;
this.age = age;
this.adult = adult;
}
public Member getMember(){
Member cloned = null;
try {
cloned = (Member) clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return cloned;
}
@Override
public String toString() {
return id + ", " + name + ", " + password + ", " + age + ", " + adult;
}
public void setId(String id) {
this.id = id;
}
public void setName(String name) {
this.name = name;
}
public void setPassword(String password) {
this.password = password;
}
public void setAge(int age) {
this.age = age;
}
public void setAdult(boolean adult) {
this.adult = adult;
}
}
package sec03.exam04_clone;
public class MemberExample {
public static void main(String[] args) {
Member original = new Member("blue","홍길동", "12345", 35, true);
Member cloned = original.getMember();
System.out.println("cloned"+cloned);
cloned.setPassword("0000");
System.out.println("cloned"+cloned);
System.out.println("original: "+original);
}
}
"C:\Program Files\JetBrains\IntelliJ IDEA 2019.2.3\jbr\bin\java.exe" "-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA 2019.2.3\lib\idea_rt.jar=64744:C:\Program Files\JetBrains\IntelliJ IDEA 2019.2.3\bin" -Dfile.encoding=UTF-8 -classpath C:\study\thisisjava\out\production\thisisjava sec03.exam04_clone.MemberExample
clonedblue, 홍길동, 12345, 35, true
clonedblue, 홍길동, 0000, 35, true
original: blue, 홍길동, 12345, 35, true
Process finished with exit code 0
흔히 primitive타입을 제외하고 참조타입은 shallow copy를 피하고 deep copy을 사용하기 위해서
Clonable을 구현하고 clone()을 오버라이딩 해야 한다고 말한다.
하지만 실제로 해보면 String의 경우에는 clone을 재구현 할 필요가 없다.
이는 참조타입이더라도 String은 배열이나 객체와는 다르게 Imutable Object이기 때문이다.
배열이나 객체처럼 안속에 또 바꿔줘야 할 것들이 컬렉션 처럼 들어 있지 않아서 단순하며
String은 변경시에 실제로는 기존의 것이 변경되는 것이 아니라 힙영역에 자동으로 새로 할당 처리 된다.
따라서 String의 경우에는 재구현 할 필요없으므로
이글의 제목은 엄밀히는 옳지 않은 구분방법이라 말할 수 있다.
키워드: 불변객체 가변객체 clone
참조:
https://limkydev.tistory.com/68
https://stackoverflow.com/questions/22488506/why-string-class-is-not-cloneable
'Language > Java' 카테고리의 다른 글
JNI 예제 잘되어 있는 곳 (0) | 2020.07.02 |
---|---|
LOG4J2와 로깅 라이브러리 (0) | 2020.06.11 |
타입파라미터를 제한하는 방법은 두가지이다. (0) | 2019.09.02 |
Thread상태상수인 WAITING, BLOCKED와 상태제어 메소드인 wait()과 notify()의 관계 (0) | 2019.09.01 |
Future<T> submit(Runnable task, T result)는 무엇을 리턴하나? (0) | 2019.08.31 |
댓글