본문 바로가기
Language/Java

얕은 복사를 피하기 위해서 참조객체는 clone을 재구현해야 한다?

by fabxoe 2019. 10. 21.
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

 

 

댓글