자바에서 객체를 복사하는 방법은 얕은복사(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
코드를 작성하다보면 객체를 받아오는 경우들이 많이 있었는데 이 때 객체간의 관계를 잘 파악해야했다.
위에서처럼 얕은 복사를 할 경우 객체 값의 변경이 다른 객체에도 영향을 줄 수 있어서 주의해야한다.
보기엔 간단해보이지만 막상 코드로 작성하니 놓치기 쉬웠다. 객체간의 관계 분석에 더 익숙해져야겠다.
'부트캠프 개발일기 > Java' 카테고리의 다른 글
15일차: 컬렉션(Enum, Generic, Exception Handling) (0) | 2023.03.06 |
---|---|
14일차: 미니 프로젝트(의존성 주입) (0) | 2023.03.03 |
12일차: 객체지향 프로그래밍 심화(다형성/Polymorphism, 추상화/Abstraction) (0) | 2023.02.28 |
11일차: 객체지향 프로그래밍 심화(상속/Inheritance, 캡슐화/Encapsulation) (0) | 2023.02.27 |
10일차: 객체지향 프로그래밍 기초(생성자, 내부클래스) (0) | 2023.02.24 |