본문 바로가기
부트캠프 개발일기/Java

13일차: 미니 프로젝트(얕은복사 vs 깊은복사)

by shyun00 2023. 3. 2.

자바에서 객체를 복사하는 방법은 얕은복사(shallow copy)와 깊은복사(deep copy) 두가지가 있음

❯ 얕은 복사(Shallow Copy)

객체 내용을 복사하는 것이 아니라, 객체의 참조값(reference)만을 복사하는 방법.

복사된 개체는 원본 객체와 같은 내용을 가리키게 되므로 복사된 객체 내용을 수정하면 원본 객체 내용도 함께 변경됨

 깊은 복사(Deep Copy)

객체의 내용을 복사하는 방법.

복사된 객체와 원본 객체는 서로 독립적으로 존재하며 하나를 수정해도 다른 객체에는 영향 주지 않음

 

<예시>

아래와 같은 클래스가 있다고 가정

class Person {
    private String name;
    private int age;
    private Address address;
    // getter, setter, constructor 등 생략
}

class Address {
    private String city;
    private String street;
    // getter, setter, constructor 등 생략
}

 

1. Person 객체를 생성하고 얕은 복사를 사용할 경우

Person original = new Person("Kate", 30, new Address("Seoul", "Gangnam"));
Person shallowCopy = original; // 얕은 복사에 해당

 

original 과 shallowCopy 는 같은 내용을 가리키기 때문에 shallowCopy 객체를 수정하면 두 객체 모두 수정이 반영됨

shallowCopy.getAddress().setCity("Busan");
System.out.pringln(original.getAddress().getCity());

// 출력결과 : Busan

 

2. Person 객체를 생성하고 깊은 복사를 사용할 경우

Person original = new Person("Kate", 30, new Address("Seoul", "Gangnam"));
Person deepCopy = new Person(original.getName(), original.getAge(), new Address(original.getAddress().getCity(), original.getAddress().getstreet());

// 깊은 복사에 해당. 새로운 객체를 생성하여 내용을 복사함

 

original과  deepCopy는 독립적인 객체이므로 한쪽의 값을 변경해도 다른 객체를 변경시키지 않음

deepCopy.getAddress().setCity("Busan");
System.out.pringln(original.getAddress().getCity());

// 출력결과 : Seoul

코드를 작성하다보면 객체를 받아오는 경우들이 많이 있었는데 이 때 객체간의 관계를 잘 파악해야했다.

위에서처럼 얕은 복사를 할 경우 객체 값의 변경이 다른 객체에도 영향을 줄 수 있어서 주의해야한다.

보기엔 간단해보이지만 막상 코드로 작성하니 놓치기 쉬웠다. 객체간의 관계 분석에 더 익숙해져야겠다.