[Dart] Shallow copy & Deep copy

Minji Jeong·2025년 3월 9일
0

Flutter/Dart

목록 보기
13/13
post-thumbnail
class User {
  String? name;
  User({this.name});
}

void main() async {
  User user1 = User(name: 'A');
  User user2 = user1;
  user1.name = 'B';
  print(user2.name);
}

// Result : B

User라는 클래스가 있고, user1과 user2는 User 클래스의 객체들입니다. user2 에 user1이 할당되고, 이후에 user1의 값이 변경되었으니 user2의 name은 ‘A’가 될 것 같지만 결과값으로는 B가 출력됩니다. 바로 user2 객체에 얕은 복사가 이루어졌기 때문인데요, 기본적인 개념이지만 제대로 알고 넘어가지 않을 경우 대규모 프로젝트에서 해당 이슈로 문제가 생겼을 때 트러블 슈팅이 어려울 수 있습니다. 따라서 오늘 포스팅에서 Dart에서의 얕은 복사와 깊은 복사에 대해 짧게 정리해보고자 합니다.

얕은 복사 - Shallow copy

얕은 복사는 객체의 참조, 즉 객체가 저장된 메모리 주소가 복사되는 것을 의미합니다. 따라서, a 객체를 b 객체에 할당할 경우 b 객체에 a 객체가 저장된 메모리 주소값이 할당되기 때문에 각 객체가 동일한 메모리 주소값을 공유하게되고, 원본 객체의 필드값이 변경될 경우 복사본의 필드값도 변경됩니다.

두 객체의 해시 코드 값을 확인했을 때 동일한 값이 출력됩니다.

class User {
  String? name;
  User({this.name});
}

void main() {
  User user1 = User(name: 'A');
  User user2 = user1;
  user1.name = 'B';
  print('user1 hashcode: ${user1.hashCode}');
  print('user2 hashcode: ${user2.hashCode}');
  print(user1 == user2);
}

// Result
// user1 hashcode: 371557605
// user2 hashcode: 371557605
// true

해시 코드
Dart에서 객체를 고유하게 식별하는 정수 값으로, 객체의 내부 상태에 기반하여 계산되며, 동일한 내용을 가진 두 객체는 동일한 해시 코드를 가질 수 있습니다.

class User {
  String? name;
  User({this.name});
}

void main() {
  User user1 = User(name: 'A');
  User user2 = User(name: 'A');
  print('user1 hashcode: ${user1.hashCode}');
  print('user2 hashcode: ${user2.hashCode}');
  print(user1 == user2);
}

// Result
// user1 hashcode: 619544964
// user2 hashcode: 176677860
// false

깊은 복사 - Deep copy

객체의 복사본을 생성할 때 원본 객체와 별개의 메모리 주소를 가지도록 모든 필드와 하위 객체를 재귀적으로 복사하는 것을 의미합니다. 따라서 딥 카피로 생성된 복사본의 필드값이 변경되어도 원본 객체는 영향을 받지 않습니다.

class User {
  String? name;
  User({this.name});

  User clone(String? name) {
    return User(name: name);
  }
}

void main() {
  User user1 = User(name: 'A');
  User user2 = user1.clone('B');
  user1.name = 'C';
  print('${user2.name}');
  print('user1 hashcode: ${user1.hashCode}');
  print('user2 hashcode: ${user2.hashCode}');
  print(user1 == user2);
}

// Result
// B
// user1 hashcode: 821925869
// user2 hashcode: 837483639
// false

References

https://velog.io/@ahserkim/Dart-Shallow-Copy-%EC%99%80-Deep-Copy

https://velog.io/@sinbee0402/Dart-Instance-basic-control

profile
Software Engineer

0개의 댓글