블로그 이미지
잡초 개발자의 좌충우돌 이야기 yysvip

카테고리

분류 전체보기 (211)
Java Programing (24)
Web Programing (20)
Database (36)
Tool (46)
까칠한 IT (27)
까칠한 정보 (42)
까칠한 Strory (16)
까칠한 Project (0)
Total1,164,494
Today4,461
Yesterday4,153

달력

« » 2018.12
            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          

공지사항

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 CopyDeep 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;
    }
}

Posted by yysvip

최근에 달린 댓글

최근에 받은 트랙백

글 보관함