티스토리 뷰

반응형

얕은 복사와 깊은 복사

얕은 복사

하나의 객체의 주소값을 복사하는 경우를 말한다.

public static void main(String[] args) {
  Cat navi = new Cat("navi");

  Cat yo = navi;
  yo.chgName("yo");

  System.out.println(navi.getName());
  System.out.println(yo.getName());
}

//결과
yo
yo

 

 

깊은 복사

하나의 객체의 값들을 복사하는 경우를 말한다.

public class Cat implements Cloneable{
    ...

     public Cat copy() throws CloneNotSupportedException {
    Cat ret = (Cat)this.clone();
    return ret;
  }
}

public static void main(String[] args) throws CloneNotSupportedException {
  Cat navi = new Cat("navi");

  Cat yo = navi.copy();
  yo.chgName("yo");

  System.out.println(navi.getName());
  System.out.println(yo.getName());
}

//결과
navi
yo

디버깅을 해보면 주소값이 다르게 나타나는 것을 확인할 수 있다. 즉, yo라는 Cat 클래스를 새로운 메모리에 할당하는 것이다.

 

 

예외

Cat의 Age도 설정해보자.

public class Cat implements Cloneable{
  private String name;
    private Age age;
  ...
}

public class Age {
  private int year;
  private int value;
}

public static void main(String[] args) throws CloneNotSupportedException {
  Cat navi = new Cat("navi", new Age(2018, 3));

  Cat yo = navi.copy();
  yo.chgName("yo");
  yo.chgAge(2013, 2);

  System.out.println(navi.toString());
  System.out.println(yo.toString());
}

//결과
Cat{name='navi', age=Age{year=2013, value=2}}
Cat{name='yo', age=Age{year=2013, value=2}}
  • 결과를 살펴보면 navi를 copy한 yo의 나이를 변경하였더니, navi의 나이 또한 변경된 것을 확인할 수 있다. 해당 부분은 Cat클래스에서 copy를 진행할 때 Age까지는 깊은 복사가 안되는 것을 확인한 것이다.

  • 우리가 원하는 결과를 추출하기 위해 소스를 변경하면 copy 부분을 변경하면 된다.

    public class Cat implements Cloneable{
        ...
    
         public Cat copy() throws CloneNotSupportedException {
        Cat ret = (Cat)this.clone();
        ret.age = new Age(this.age.getYear(), this.age.getValue());
        return ret;
      }
    }

     

 

 

반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
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
글 보관함