객체 복사는 메모리를 효율적으로 관리하고 데이터의 일관성을 유지하는 데 중요한 역할을 합니다. 객체 복사에는 얕은 복사와 깊은 복사가 있으며, 각각의 특성과 용도를 이해하고 적절하게 사용하는 것이 중요합니다.
얕은 복사는 참조(메모리 주소)만을 복사하는 방식입니다. 따라서 두 변수가 동일한 메모리를 바라보게 되어 하나의 값을 변경하면 다른 변수의 값도 변경됩니다.
List<int> a = [1];
List<int> b = a; // 얕은 복사
print(a == b); // true (동일한 메모리 주소)
깊은 복사는 값이 동일한 새로운 객체를 생성하는 방식입니다. 따라서 두 변수가 다른 메모리를 바라보게 되어 하나의 값을 변경해도 다른 변수의 값은 변경되지 않습니다.
List<int> a = [1];
List<int> b = List.from(a); // 깊은 복사
print(a == b); // false (다른 메모리 주소)
불변 객체는 객체가 생성된 후 그 상태를 변경할 수 없는 객체를 의미합니다. 불변 객체를 활용하면 얕은 복사와 깊은 복사의 장점을 모두 누릴 수 있습니다.
const List<int> b1 = [1, 2, 3];
// b1.add(4); // 에러 발생