ex)
class Person { String name; Address address; Person(String name, Address address) { this.name = name; this.address = address; } } class Address { String city; Address(String city) { this.city = city; } } public class ShallowCopyExample { public static void main(String[] args) { Address address = new Address("Seoul"); Person original = new Person("John", address); // 얕은 복사 Person copy = original; // 변경 사항 확인 copy.address.city = "Busan"; // 원본 객체와 복사본 객체의 주소가 같으므로 주소도 변경됨 System.out.println("Original address city: " + original.address.city); // Busan System.out.println("Copy address city: " + copy.address.city); // Busan } }
ex) clone 메서드를 사용한 예시
class Address implements Cloneable { String city; Address(String city) { this.city = city; } @Override protected Object clone() throws CloneNotSupportedException { return super.clone(); } } class Person implements Cloneable { String name; Address address; Person(String name, Address address) { this.name = name; this.address = address; } @Override protected Object clone() throws CloneNotSupportedException { Person copy = (Person) super.clone(); copy.address = (Address) address.clone(); // Address 객체도 복사 return copy; } } public class DeepCopyExample { public static void main(String[] args) throws CloneNotSupportedException { Address address = new Address("Seoul"); Person original = new Person("John", address); // 깊은 복사 Person copy = (Person) original.clone(); // 변경 사항 확인 copy.address.city = "Busan"; // 원본 객체와 복사본 객체의 주소가 다르므로 주소도 독립적 System.out.println("Original address city: " + original.address.city); // Seoul System.out.println("Copy address city: " + copy.address.city); // Busan } }ex 2) 복사 생성자를 통한 깊은 복사
class Address { String city; Address(String city) { this.city = city; } Address(Address other) { this.city = other.city; } } class Person { String name; Address address; Person(String name, Address address) { this.name = name; this.address = address; } // 복사 생성자 Person(Person other) { this.name = other.name; this.address = new Address(other.address); } } public class DeepCopyExample { public static void main(String[] args) { Address address = new Address("Seoul"); Person original = new Person("John", address); // 깊은 복사 Person copy = new Person(original); // 변경 사항 확인 copy.address.city = "Busan"; // 원본 객체와 복사본 객체의 주소가 다르므로 주소도 독립적 System.out.println("Original address city: " + original.address.city); // Seoul System.out.println("Copy address city: " + copy.address.city); // Busan } }