얕은 복사 VS 깊은 복사

알비레오·2024년 8월 31일

자바

목록 보기
3/17

얕은 복사(Shallow Copy)

  • 객체를 복사할 때, 해당 객체만 복사하여 새 객체를 생성한다.
  • 복사된 객체의 인스턴스 변수는 원본 객체의 인스턴스 변수와 같은 메모리 주소를 참조한다
  • 해당 메모리 주소의 값이 변경되면 원본 객체 및 복사 객체의 인스턴스 변수 값은 같이 변경된다.

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

깊은 복사(Deep Copy)

  • 객체를 복사할 때, 해당 객체와 인스턴스 변수까지 복사하는 방식
  • 전부를 복사하여 새 주소에 담기 때문에 참조를 공유하지 않는다.

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

0개의 댓글