// 리스트 초기화 자바라면-> List<Integer> nums = new ArrayList<>();
List<int> nums = [1, 2, 3, 4];
var list = [1, 2, 3, 4];
//컬렉션은 시작번지 갖고있어서 final 많이 씀 값 변경과는 관련 ㄴ
final arr = [1, 2, 3, 4];
void main() {
print(arr[0]);
}
맵(Map)
맵의 리턴 값이
{id : 1, username : ssar}
이렇다.Json이랑 생긴게 흡사함. 그래서 json 데이터가 DTO 필요없이 Map 으로 받아진다.
Map<String, dynamic> session = {"id": 1, "username": "ssar"};
void main() {
session["model"] = "username";
}
맵 내부에서 바로 값 할당할 수 있고 main 에서 한 것처럼 값 추가할 ㅅ ㅜ있음

- 값 삭제하는 법

Set
import 'dart:math';
void main() {
//set 의 특징 : 중복이 되지 않는 자료형이다.
Set<int> lotto = {};
// Random 클래스는 dart:math 라이브러리를 사용합니다.
Random r = Random();
lotto.add(r.nextInt(45) + 1);
lotto.add(r.nextInt(45) + 1);
lotto.add(r.nextInt(45) + 1);
lotto.add(r.nextInt(45) + 1);
lotto.add(r.nextInt(45) + 1);
lotto.add(r.nextInt(45) + 1);
print(lotto); //set 타입 {11, 34, 3, 30, 12, 44}
// toList() 함수를 사용하면 List 타입으로 변경 가능합니다.
List<int> lottoList = lotto.toList();
// List 타입은 sort() 메서드로 정렬할 수 있다.
lottoList.sort();
print(lottoList); // 컬렉션 타입 [3, 11, 12, 30, 34, 44]
}
for
초밥에 간장을 찍어먹을겁니다.

하나하나 필드에 접근해서 간장 찍는건 비효율적…
따라서 for문을 사용해 봅니다.
void main() {
var chobab = ["새우초밥", "연어초밥", "관자초밥"];
// chobab[0] = chobab[0] + "_간장";
// chobab[1] = chobab[1] + "_간장";
// chobab[2] = chobab[2] + "_간장";
for (var i = 0; i < chobab.length; i++) {
chobab[i] = chobab[i] + "_간장";
}
print(chobab);
}
List → map
map 은 데이터를 가공할 때 사용!!

list 가 map 이 되려면 내부를 돌면서 값을 꺼내 주어야 한다. (람다 식이나 익명함수가 나온다)
void main() {
var chobab = ["새우초밥", "연어초밥", "관자초밥"];
var changeChobab = chobab.map((e) => e + "_간장").toList();
print(chobab); // [새우초밥, 연어초밥, 관자초밥]
print(changeChobab); // [새우초밥_간장, 연어초밥_간장, 관자초밥_간장]
}
그런데 관자 초밥에는 간장을 뿌리지 않으려 한다.
void main() {
var chobab = ["새우초밥", "연어초밥", "관자초밥"];
var changeChobab = chobab.map((e) {
if (e == "관자초밥") {
return e;
} else {
return e + "_간장";
}
}).toList();
print(chobab); // [새우초밥, 연어초밥, 관자초밥]
print(changeChobab); // [새우초밥_간장, 연어초밥_간장, 관자초밥]
}
where
컬렉션에서 검색/삭제 할 때 사용
void main() {
var chobab = ["새우초밥", "연어초밥", "관자초밥"];
var changechbab = chobab.where((e) => e == "관자초밥").toList();
print(changechbab); // [관자초밥]
}
void main() {
var chobab = ["새우초밥", "연어초밥", "관자초밥", "칠리관자초밥"];
var changechbab = chobab.where((e) => e.contains("관자")).toList();
var removechbab = chobab.where((e) => e != "새우초밥").toList();
print(changechbab); // [관자초밥, 칠리관자초밥]
print(removechbab); // [연어초밥, 관자초밥, 칠리관자초밥]
}
chobab 과 같은 원 데이터의 불변성을 지켜 주어야 컴퓨터가 데이터 변경 유무를 알 수 있기 때문에
원래의 데이터를 건들이지 않아야 한다.
List 에 값 추가할 때
void main() {
var chobab = ["새우초밥", "연어초밥", "관자초밥", "칠리관자초밥"];
var changeChobab = [...chobab, "장어초밥"];
print(changeChobab); // [새우초밥, 연어초밥, 관자초밥, 칠리관자초밥, 장어초밥]
}
컬렉션에 object 넣어서 활용
class User {
int id;
String username;
String password;
User(this.id, this.username, this.password);
// 이름이 있는 생성자
User.hello(
{required this.id, required this.username, required this.password});
// Map 을 받아 Object 로 변환 -> initialize 키워드 써야함
User.fromJson(Map<String, dynamic> json)
: this.id = json["id"],
this.username = json["username"],
this.password = json["password"];
}
void main() {
User u1 = User(1, "ssar", "1234");
User u2 = User.hello(id: 1, username: "ssar", password: "1234");
User u3 = User.fromJson({"id": 1, "username": "ssar", "password": "1234"});
print(u1.username); //ssar
print(u2.username); //ssar
print(u3.username); //ssar
}
자바처럼 오버로딩이 아니라 이름있는 생성자로 만든다.
가공
class Dog {
int age;
String name;
Dog(this.age, this.name);
@override
String toString() {
return 'Dog(age: $age, name: $name)';
}
}
void main() {
// CRUD
final list = [Dog(1, "토토"), Dog(2, "레르코"), Dog(3, "우유")];
//1. 추가
var add = [...list, Dog(4, "해피")];
print(add.toString());
//2. 수정 (age 가 1번인 아이의 이름을 토루토)
var update = list.map((e) {
if (e.age == 1) {
// return Dog(e.age, "토르토");
e.name = "토르토";
return e;
} else {
return e;
}
}).toList();
print(update.toString());
//3. 삭제 (age가 3번인 것을 삭제)
var del = list.where((e) => e.age != 3).toList();
print(del.toString());
}
수정할 때 e.name=”토르토” 를 해 버리면 list 번지에 있는 토토의 이름을 바꿔버려
3번의 삭제에서 호출시 “토르토” 라는 이름이 튀어나온다.
주석되어있는 Dog(e.age, “토르토”); 를 하면
2번만 이름이 “토르토”가 되고 3번은 원래의 “토토” 이름이 나오게 된다.
마무리
이렇게 기존의 객체에 있는 값을 보존하려는 이유는 플러터나 리액트는 상태 변화를 추척하여
변화된 부분만 부분 랜더링을 해주기 때문이다.
기존의 값이 변경되면 코드 작성자는 유추할 수 있지만 컴퓨터는 비교할 대상이 없기 때문에
변경 유무를 알 수 가 없다.
따라서, 원래 상태를 그대로 유지하면서 새 객체를 반환하는 것이 좋다.
Share article