[잡초의 삽질] Shallow Copy & Deep Copy
Shallow Copy & Deep Copy |
|
까칠한 남자 Strory yysvip.tistory.com 잡초 개발자 까찰한 쑤의 좌충우돌 개발 이야기 |
변수 타입은 2가지 타입으로 나눌 수 있는데,
- 기본형(Primitive Type)
- boolean, char, byte, short, int, long, float, double 계산을 위한 실제 값을 저장한다.
- 참조형(Reference Type)
- 8개의 기본형을 제외한 나머지 타입, 객체의 주소를 저장한다.
기본형 변수는 실제 값(Data)을 저장하는 반면에, 참조형 변수는 어떤 값이 저장되어 있는 주소를 값으로 갖는다.
둘의 가장 큰 차이점은 '데이터의 크기가 결정되어 있느냐'와 그렇지 않다면 '주소값을 이용한다.'이다.
즉, primitive는 데이터를 곧바로 저장하며 reference는 주소값을 저장한다는 것이다.(C의 포인터)
자바는 C언어와는 달리 String을 제외한 참조형 변수간의 연산을 할 수 없으므로 실제 연산에 사용되는 것은 모두 기본형 변수이다. 참조 변수간의 값 할당은 Shallow copy 에 의해서 참조 값이 복사되게 된다. 즉, 할당된 하나의 객체를 여러 참조 변수들이 가리키게 된다.
■ Shallow Copy & Deep Copy
JAVA에서 참조변수를 복사하는 방법에는 Shallow Copy와 Deep Copy가 있다.
■ Shallow Copy
원본 참조변수의 참조값만 복사하는것
■ Deep Copy
원본 참조변수의 참조값이 가르키는 객체를 메모리 공간에 복사생성 후 복사본 참조변수가 가르키는 것
Shallow Copy의 경우 복사 후 원본이나 복사본을 수정하면 둘다 동일한 객체를 참조하기에 같이 변경 되지만,
Deep Copy의 경우 원본과 복사본은 독립적인 객체이므로 영향을 받지 않는다.
import java.util.ArrayList; public class CopyTest { public static void main(String[] args) { ArrayList<Person> arryOrg = new ArrayList<Person>(); ⁄⁄ 원본 객체 Person personOrg = new Person(); personOrg.setName("홍길동"); arryOrg.add(personOrg); ⁄⁄ Shallow Copy ArrayList<Person> arryShallow = (ArrayList<Person>)arryOrg.clone(); System.out.println("[Shallow Copy]"); System.out.println("변경 전 원본 > " + arryShallow.get(0).getName()); ⁄⁄ 변경 전 System.out.println("변경 전 복사본 > " + arryShallow.get(0).getName()); ⁄⁄ 변경 전 ⁄* 원본 변경 *⁄ personOrg = arryShallow.get(0); personOrg.setName("이순신"); arryShallow.set(0, personOrg); System.out.println("원본 변경 후 > " + arryOrg.get(0).getName()); ⁄⁄ 변경 후 System.out.println("원본 변경 후 복사본 > " + arryShallow.get(0).getName()); ⁄⁄ 변경 후 ⁄⁄ Deep Copy ArrayList<Person> arryDeep = new ArrayList<Person>(); Person objDeep = new Person(); objDeep.setName(arryOrg.get(0).getName()); arryDeep.add(objDeep); System.out.println("\n[Deep Copy]"); System.out.println("변경 전 원본 > " + arryOrg.get(0).getName()); ⁄⁄ 변경전 System.out.println("변경 전 복사본 > " + arryDeep.get(0).getName()); ⁄⁄ 변경전 ⁄* 원본 변경 *⁄ personOrg = arryOrg.get(0); personOrg.setName("세종대왕"); arryOrg.set(0, personOrg); System.out.println("원본 변경 후 > " + arryOrg.get(0).getName()); ⁄⁄ 변경후 System.out.println("원본 변경 후 복사본 > " + arryDeep.get(0).getName()); ⁄⁄ 변경후 } } class Person { private String name ; public String getName() { return name; } public void setName(String name) { this.name = name; } }
'까칠한 Strory > 잡초의 삽질' 카테고리의 다른 글
[잡초의 삽질] 2자리 년도 Timestamp 변환 (0) | 2014.04.11 |
---|---|
[잡초의 삽질] java.lang.NoSuchMethodError 오류 발생 시 조치 (0) | 2013.12.04 |
[잡초의 삽질] Shallow Copy & Deep Copy (0) | 2013.11.21 |
[잡초의 삽질] The processing instruction target matching "[xX][mM][lL]" is not allowed (0) | 2013.11.20 |
[잡초의 삽질] 올바른 equals() 사용법 (0) | 2013.11.12 |
[잡초의 삽질] Oracle 자동증분 Sequence와 max(seq)+1의 차이 (0) | 2013.11.12 |