[OSAM] DART 언어 기초(16) 스프레드 연산자(깊은복사, 값변경, 값추가)

hello_hidi·2021년 7월 23일
0

[국소아] DART

목록 보기
15/16
post-thumbnail

> 깊은 복사 vs 얕은 복사

  • 얕은 복사 => 레퍼런스 복사 => 같은 주소
  • 깊은 복사 = > 값만 복사 => 다른 주소
    스프레드 연산자 : ... -> 깊은 복사를 위한 키워드
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]
}
profile
안뇽희디

0개의 댓글