- 얕은 복사 => 레퍼런스 복사 => 같은 주소
- 깊은 복사 = > 값만 복사 => 다른 주소
스프레드 연산자 : ... -> 깊은 복사를 위한 키워드
void main(){
var list = [1,2,3];
var lowList = list;
var deepList = [...list]; //깊은 복사 = 값을 복사 -> 다른 주소
print(list.hashCode);140016927
print(lowList.hashCode);140016927
print(deepList.hashCode);1049190296
list[0] = 10;
print(list); [10, 2, 3]
print(lowList); [10, 2, 3]
print(deepList); [1, 2, 3]
}
lowList : 얕은 복사 so list와 주소값이 같음 + list의 값이 바뀐것이 그대로 적용
deepList : 깊은 복사 so list와 주소값이 다름 + list의 값이 바뀐것이 적용 안됨
void main(){
var list = [{"id":1},{"id":2}];
var subList = list;
var newList = [...list];
list[0]["id"] = 10;
print(list); [{id: 10}, {id: 2}]
print(newList); [{id: 10}, {id: 2}]
print(list.hashCode); 149465054
print(newList.hashCode); 404026738
print(subList.hashCode); 149465054
}
why? : 오브젝트, 클래스 등등 기본 변수의 값을 들고 있지 않을 경우에는 이것들의 주소 자체를 그대로 복사해온다
즉. {id: 10} 이거 자체의 주소는 똑같다는 것이다!
var newList = list.map((i)=>{...i}).toList();
=> 이 코드를 통해서 각 인덱스를 그대로 스프래드 해야된다!
★... 변수 , 값 ★
void main(){ var users = [ {"id":1, "username" : "cos", "password" : 1234}, {"id":2, "username" : "ssal", "password" : 5678} ];
내가 이 코드에서 id2번의 username을 변환하고 싶다! 그러면 이런 코드를 쓸 것이다!
var newUsers = users.map((i)=> i["id"] == 2 ? {"username" : "love"} : i).toList(); print(newUsers); 결과값 : [{id: 1, username: cos, password: 1234}, {username: love}]
이렇게 뒤에 내용이 잘리게 된다. 다른 것들은 복사되서 안 왔기 때문이다.
※ ', ' 다음에 같은 key값의 value값을 덮어씌운다.
ex) {...i,"username" : "love"}
하나씩 복사하다가 username의 key값을 만나면 love로 값을 변경해주는 것이다!var newUsers = users.map((i)=> i["id"] == 2 ? {...i,"username" : "love"} : i).toList(); print(newUsers);
만약 같은 key값이 없다면 그냥 추가해준다
void main(){ var test = [1,2,3,4]; var newTest = [...test, 5]; print(newTest); 결과값 : [1,2,3,4,5] }