[Dart] Shallow Copy 와 Deep Copy

AsherKim·2023년 5월 30일
0

플러터 TIL

목록 보기
13/18

Shallow Copy (얕은 복사):

객체의 복사본을 생성할 때 원본 객체와 같은 메모리 주소를 공유하는 경우를 말한다. 즉, 객체 내의 참조형 필드는 복사되지 않고 참조만 복사된다. 따라서 원본 객체와 복사본 객체가 동일한 하위 객체를 참조하게 된다. 이로 인해 하나의 객체를 변경하면 다른 객체도 변경되는 문제가 발생할 수 있다.

class Person {
  String name;
  List<String> hobbies;

  Person(this.name, this.hobbies);
}

void main() {
  var original = Person('John', ['reading', 'swimming']);
  var copy = Person(original.name, original.hobbies);

  copy.name = 'Bob';
  copy.hobbies.add('running');

  print(original.name); // 출력: John
  print(original.hobbies); // 출력: [reading, swimming, running]
  print(copy.name); // 출력: Bob
  print(copy.hobbies); // 출력: [reading, swimming, running]
}

위의 예시에서 copy 객체는 original 객체와 동일한 name과 hobbies를 가지지만, hobbies는 동일한 List 객체를 참조하고 있다. 따라서 copy.hobbies.add('running')으로 인해 original 객체의 hobbies도 변경되는 것을 볼 수 있다.

Deep Copy(깊은 복사):

Deep Copy는 객체의 복사본을 생성할 때 원본 객체와 별개의 메모리 주소를 가지도록 모든 필드와 하위 객체를 재귀적으로 복사하는 것을 말합니다. 이로 인해 원본 객체와 복사본 객체가 완전히 독립적인 개체가 되므로, 하나의 객체를 변경해도 다른 객체에는 영향을 주지 않습니다.

class Person {
  String name;
  List<String> hobbies;

  Person(this.name, this.hobbies);

  Person.deepCopy(Person original) {
    name = original.name;
    hobbies = List<String>.from(original.hobbies);
  }
}

void main() {
  var original = Person('John', ['reading', 'swimming']);
  var copy = Person.deepCopy(original);

  copy.name = 'Bob';
  copy.hobbies.add('running');

  print(original.name); // 출력: John
  print(original.hobbies); // 출력: [reading, swimming]
  print(copy.name); // 출력: Bob
  print(copy.hobbies); // 출력: [reading, swimming, running]
}

위의 예시에서 deepCopy 생성자는 original 객체의 필드를 복사하여 새로운 name과 hobbies를 가지는 복사본 객체를 생성한다. 이 때 hobbies 필드는List.from() 메서드를 사용하여 복사본 객체에 원본 hobbies 리스트의 요소들을 복사한다. 이렇게 함으로써 복사본 객체와 원본 객체는 독립적인 List 개체를 참조하게 된다. 따라서 copy.hobbies.add('running')으로 인해 원본 객체의 hobbies는 변경되지 않는다.

Deep Copy를 사용하면 객체의 내부 구조를 완전히 복사하여 두 객체를 독립적으로 다룰 수 있다. 하지만 객체의 구조가 복잡하고 깊은 중첩을 가지는 경우, Deep Copy는 성능 측면에서 부담이 될 수 있다. 따라서 복사가 필요한 경우에만 Deep Copy를 사용하는 것이 좋다.

Shallow Copy와 Deep Copy는 객체 복사 시 참조 관계를 어떻게 다루는지에 따라 다른 결과를 만들어내므로, 객체 복사의 목적과 상황에 맞게 선택해야 한다.

profile
추리를 좋아하는 개발자

0개의 댓글