728x90
Class Fruits의 인스턴스를 생성하고 a.list 의 값을 확인해보자.
참조변수 b 에 a.list 를 할당하는 것은 shallow copy(얕은 복사)로 같은 메모리 주소를 바라보고 있어 동일한 값을 가진다.
참조변수 b에 새로운 값을 할당하고 나서 a.list 를 출력해보면 새로 추가한 수박이 반영되어 있는 걸 확인할 수 있다.
깊은 복사 방법은
- toList()를 추가하여 새로운 배열을 만드는 방법,
- 전개 연산자(...)를 사용하는 방법,
- map()함수를 활용하는 방법
이 있다.
class Fruits {
List<String> _list = ['사과','복숭아','배','감','호두','자두'];
List<String> get list => _list;
}
void main(){
final a = Fruits();
print(a.list); // [사과, 복숭아, 배, 감, 호두, 자두]
List<String> b = a.list;
print(b); // [사과, 복숭아, 배, 감, 호두, 자두]
print(a.list == b); // true 얕은 복사(동일한 메모리 주소를 가짐)
b.add('수박');
print(a.list); // [사과, 복숭아, 배, 감, 호두, 자두, 수박]
List<String> c = a.list.toList(); // 새로운 배열
print(c == a.list); // fasle 깊은 복사(deep copy)
print(c); // [사과, 복숭아, 배, 감, 호두, 자두, 수박]
/***
* 깊은 복사란, 값이 동일한 객체를 새롭게 생성하는 것을 의미한다.
*/
List<String> d = [...a.list]; // 전개 연산자를 활용하여 새로운 배열
print(d == a.list); // false 깊은 복사
print(d); // [사과, 복숭아, 배, 감, 호두, 자두, 수박]
List<String> e = a.list.map((e) => e).toList();
// map은 배열을 순환하며 값을 변경할 수 있는 함수이다.
// map()은 Iterable을 반환한다.
print('-------------------------------');
print(e); // [사과, 복숭아, 배, 감, 호두, 자두, 수박]
print(e == a.list); // false. 깊은 복사
c.add('살구');
print(c); // [사과, 복숭아, 배, 감, 호두, 자두, 수박, 살구]
print(a.list); // [사과, 복숭아, 배, 감, 호두, 자두, 수박]
d.add('포도');
a.list.remove('복숭아');
print(d); // [사과, 복숭아, 배, 감, 호두, 자두, 수박, 포도]
print(a.list); // [사과, 배, 감, 호두, 자두, 수박]
}
|
그리고 copyWith를 활용하는 깊은 복사 방법을 알아보자.
class Person {
final String name;
final int age;
Person({
required this.name,
required this.age,
});
Person copyWith({
String? name,
int? age,
}) {
return Person(
name: name ?? this.name,
age: age ?? this.age,
);
}
@override
String toString() {
return 'Person{name: $name, age: $age}';
}
}
void main(){
final a = Person(name: '홍길동', age: 33);
final b = Person(name: '홍길동', age: 33);
print(a == b); // fasle. 객체 생성할 때마다 메모리 주소가 새로 할당된다.
final d = a;
print(d == a); // true 얕은 복사(동일한 메모리 주소를 가짐)
final e = a.copyWith(); // 깊은 복사
print(a.toString()); // Person{name: 홍길동, age: 33}
print(e.toString()); // Person{name: 홍길동, age: 33}
print(e == a); // false. 서로 다른 메모리 주소
}
|
728x90
'Flutter 앱 > Dart 언어' 카테고리의 다른 글
Dart 값 비교 - Equatable 패키지 (0) | 2024.01.17 |
---|---|
Dart cascade notation (0) | 2024.01.16 |
Dart List.where (0) | 2024.01.16 |
[Dart 고급] Dart asMap, entries (0) | 2024.01.16 |
Dart fold 함수 (2) | 2023.12.15 |