티스토리 뷰
clone()은 최고 조상인 Object클래스에 정의된 멤버이다.
이것이 하는 일은 생성된 객체와 똑같은 값을 가지고 있는 복사본의 인스턴스를 생성하는 일을한다.변경되기 전의 값을 참고해야할 때 또는 원래의 값으로 돌려 넣고 싶을 때 이용하면 도움이 될 것이다.
이 clone()를 객체를 상대로 사용하기 위해서는 해당 객체에 Cloneable이라고 하는 인터페이스 구현체를 implements 해줘야한다.그리고 해당 clone()를 오버라이딩 해 해당 객체를 복사하는 코드를 기술해야 한다.
clone()은 구현되는 사용자 클래스의 객체멤버에 대한 완전한 값복사를 지원하지 않는다. 참조복사라고하고 얕은복사라고도 하는 주소복사가 이뤄지기 때문에 복사본의 객체에 참조형 멤버변수가 존재한다면 그 값의 변경이 원본 객체에도 영향을 미친다.기본형에 대해서는 값복사가 이뤄진다.(그렇기 때문에 참조형도 값만 복사하기 위해서는 clone()메서드에서 참조형 멤버에 대하여 주소가아닌 값을 복사하도록 기술하여야 한다.)
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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 | class Member{ private String name; private Date registDate; public Member(String name, Date registDate){ this.registDate = registDate; this.name = name; } public Member(Date registDate){ } public void setName(String name){ this.name = name; } public String getName(){ return name; } public Date getRegistDate(){ return registDate; } } class TestClone implements Cloneable{ int[] array = {1,2,3,4,5}; String name = "어린이"; Member m = new Member("memberInstance", new Date()); public Object clone(){ Object obj = null; try { obj = super.clone(); } catch (CloneNotSupportedException e) { e.printStackTrace(); } return obj; } } public class ProtectCoding { public static void main(String[] args){ TestClone tc = new TestClone(); TestClone tc_copy = (TestClone)tc.clone(); System.out.println("tc의 hashcode() >> " + tc.hashCode()); System.out.println("tc_copy의 hashcode() >> " + tc_copy.hashCode()); //처음 클론객체(tc)를 clone()을 사용해서 (tc_copy)라는 복사본의 클론 객체를 만들었다. //복사본의 객체와 원본객체는 서로 다른 주소값을 가지고 있다. System.out.println(); System.out.println("tc.m.getName() 의 값 >> " + tc.m.getName()); System.out.println("tc_copy.m.getName() 의 값 >> " + tc_copy.m.getName()); System.out.println(); System.out.println("tc.m 의 hashcode() >> " + tc.m.hashCode()); System.out.println("tc_copy.m 의 hashcode() >> " + tc_copy.m.hashCode()); System.out.println("tc.name 의 hashcode() >> " + tc.name.hashCode()); System.out.println("tc_copy.name 의 hashcode() >> " + tc_copy.name.hashCode()); System.out.println(); tc_copy.name = "어른"; //깊은 복사가 일어나 기존의 값에 영향을 주지 않는다. tc_copy.m.setName("memberInstance2"); // 얕은 복사이기 때문에 복사 객체 원본도 똑같이 변경되어 영향을 준다. System.out.println("tc.m >> " + tc.m.getName()); System.out.println("tc_copy.m >> " + tc_copy.m.getName()); System.out.println("tc.name 의 hashcode() >> " + tc.name); System.out.println("tc_copy.name 의 hashcode() >> " + tc_copy.name); //이 출력 결과를 본다면 clone() 복사는 기본형 필드에 대해서 값만 복사하는 깊은 복사가 일어나 값의 변경이 기존 값에 영항을 주지 않지만 //복사될 객체의 필드중에 배열이나 객체가 존재한다면 이것들은 참조를 복사하는 얕은 복사가 일어나기 때문에 값의 변경이 기존값에 영항을 준다. } } > | cs |
결과 콘솔화면
'JAVA > 정리' 카테고리의 다른 글
익명 클래스 (0) | 2016.04.07 |
---|---|
Thread (0) | 2016.01.14 |
자바7 (0) | 2014.11.26 |
[코딩]List안에 Map자료구조의 데이터 정렬 (0) | 2014.06.08 |
java enum 열거형 (0) | 2014.01.22 |
Comments