본문 바로가기

java

shallow & deep copy

Shallow Copy : 인스턴스의 reference 복사 (window os 로 비교하면 링크 복사)

Deep Copy : 인스턴스의 메모리 복사 (window os로 비교하면 파일 복사) 

 

Shallow Copy

	List<Object> master = new ArrayList();
        master.add("1");
        master.add(new Member());


        List<Object> feather = master;

        master.add("master");
        feather.add("feather");

        System.out.println("reference = " + (master == feather));	// true
        System.out.println("hashcode() = " + (master.hashCode() == feather.hashCode()) + ", equals() = " + master.equals(feather));

 

Deep Copy

	ArrayList<Member> master = new ArrayList();
        master.add(member);

        ArrayList<Member> feather = (ArrayList<Member>) master.clone();

        System.out.println("reference = " + (master == feather));	// false

        master.add(new Member());
        feather.add(new Member());

        System.out.println("reference = " + (master == feather));	// false
        System.out.println("hashcode() = " + (master.hashCode() == feather.hashCode()) + ", equals() = " + master.equals(feather));

 

 

유의사항

String master = "origin";
String feather = master;

System.out.println("reference = " + (master == feather));	// true
System.out.println("hashcode() = " + (master.hashCode() == feather.hashCode()) + ", equals() = " + master.equals(feather));	// true

master = "updated";

System.out.println("reference = " + (master == feather));	// false
System.out.println("hashcode() = " + (master.hashCode() == feather.hashCode()) + ", equals() = " + master.equals(feather));	//false
 

* 객체를 재할당 하게 되거나, immutable 객체인 String 의 데이터를 교체하면 (뭐 이것도 재할당이니..) shallow copy 관계는 깨진다. 

* 내 생각엔 String 은 Shallow Copy 사용하는게 의미가 크기 없을 것 같다.

 

 

+ Cloneable

https://gyrfalcon.tistory.com/entry/Java-Tip-clone%EA%B3%BC-Cloneable

'java' 카테고리의 다른 글

Springframework 단상  (0) 2019.09.30
transient 와 volatile  (0) 2019.09.06
Serializable  (0) 2019.08.02
Java 실행 구조  (0) 2019.07.25
Thread Dump  (0) 2019.07.22