티스토리 뷰

JAVA/정리

clone() 에 대하여...

란텔 2015. 7. 4. 16:31

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
최근에 올라온 글
최근에 달린 댓글
TAG
more
Total
Today
Yesterday